草庐IT

c# - HMACSHA256 和 HMACSHA512 之间的区别

coder 2024-06-01 原文

我们使用以下代码在 C# 中针对敏感值生成 HMac 哈希

public string GenerateHMac(string key, string message)
{
    var decodedKey = Convert.FromBase64String(key);

    var hasher = new HMACSHA256(decodedKey);

    var messageBytes = Encoding.Default.GetBytes(message);

    var hash = hasher.ComputeHash(messageBytes);

    return Convert.ToBase64String(hash);
}

传入的 key 是一个 256 位的 base 64 编码字符串。有人问我们是否应该使用 HMACSHA256、HMACSHA384 或 HMACSHA512 来散列该值。

  • 与 HMACSHA256 相比,使用 HMACSHA512 有哪些优势?
  • 它是否更安全?
  • 使用更长的 key 是否会对性能产生显着影响?

作为旁注;如果我使用 HMACSHA512,我传递给构造函数的 decodedKey 值是否需要是 512 位 key ?

最佳答案

TL;DR:使用 HMAC-SHA512 以获得最佳速度、安全性和 OK 兼容性。 HMAC-SHA256 也非常安全,可用于 32 位运算的 CPU。此外,它在许多最新的 CPU 上得到了加速。


要了解哈希方法本身的强度,请查看 keylength.com website .你会发现即使是 SHA-256 也有相当大的安全余量。

此外,HMAC 算法几乎不会注意到对底层哈希算法的攻击。 HMAC 不受生日问题的影响,生日问题将 key 强度减半为哈希输出的一半。它并不适用,因为对手没有持有 key ,因此不能尝试制造冲突。这就是为什么即使 HMAC-SHA1 也非常安全。


现在散列的速度取决于执行环境。但总的来说,您可以做出以下假设:

  1. SHA-1 通常比同一平台上的任何 SHA-2 实现更快;
  2. SHA-512 在 64 位机器上比 SHA-256 更快(因为它们在内部使用 64 位算法);
  3. SHA-256 在 8、16 和 32 位机器上比 SHA-512 更快。

如果您预计会出现兼容性问题,请使用 SHA-1。否则你也可以选择 SHA-512(并将结果削减到合理的位数)。 SHA-512 的内部状态和更高的安全性可能略有优势。由于算法的一般问题,我遇到了客户不接受任何形式的 SHA-1 的问题;换句话说,它一般不安全的事实可能会阻碍接受。


请注意,SHA-384 和不太为人所知的 SHA-512/256 和 SHA-512/224 哈希方法是 SHA-512 的一种特殊形式,被切割成 384、256 和 224 位输出。所以这些算法的速度是相同的。除了输出大小之外的唯一区别是这些特殊形式在内部使用不同的初始值。否则,切割成 384 位的 SHA-512 与 SHA-512/384 一样安全和快速。但是,您应该使用 SHA-384 来保持兼容性 - 如果您需要特定的输出大小。

SHA-384 和 SHA-512/256 以及 SHA-512/224 使用不同的初始值,因此它们中的任何一个的输出都不同于 SHA-512 和彼此;称为域分离的功能。域分离使得无法使用攻击或(部分)预测其他相关哈希函数的哈希结果。


输入 key 的大小不依赖于底层哈希函数。 key 首先进行异或屏蔽,然后由底层哈希函数进行哈希处理;哈希算法几乎可以将无限量的数据作为输入。

建议使用的 key 大小至少为所用散列方法的大小,否则可能会降低 HMAC 方法提供的安全边际。如果 key 大小强制哈希算法对多个 block 进行哈希处理,则可能会有轻微的性能损失。


您还可以使用(即将推出的)SHA-3 标准,因为它是安全的。不过,HMAC-SHA-3 目前并没有太大意义。 HMAC 实际上对 SHA-3 (Keccak) 来说有点矫枉过正;即使没有 HMAC 构造,SHA-3 也应该是安全的。到目前为止,KMAC 已被标准化为 SHA-3 的 MAC 结构。

SHA-2 结构在 SHA-3 竞赛期间表现出相当好的抵抗密码分析的能力,这有点令人惊讶。因此,没有迫切需要升级到 KMAC/SHA-3。

关于c# - HMACSHA256 和 HMACSHA512 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18080445/

有关c# - HMACSHA256 和 HMACSHA512 之间的区别的更多相关文章

  1. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  2. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  3. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  4. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  5. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  6. ruby - 这两个 Ruby 类初始化定义有什么区别? - 2

    我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是

  7. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  8. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  9. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  10. spring.profiles.active和spring.profiles.include的使用及区别说明 - 2

    转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev

随机推荐