如何在C#中使用SHA1或MD5?(哪一个在性能和安全性方面更好)

Saj*_*ani 25 .net c# authentication md5 sha1

在C#中我们如何自动使用SHA1?
SHA1是否优于MD5?(我们对用户名和密码使用散列并需要验证速度)

Kyl*_*ndo 35

不确定你的意思是自动,但你应该真的使用SHA256和更高.也总是 在哈希中使用Salt(代码).一个侧面说明,经过一段时间后,使用硬化哈希比使用基于速度的简单哈希函数要好得多.即:散列几百次迭代,或者使用已经证实的散列函数,例如bcrypt(我相信下面会提到).在.NET中使用SHA256哈希函数的代码示例如下:

byte[] data = new byte[DATA_SIZE];
byte[] result;

using(SHA256 shaM = new SHA256Managed()) {
    result = shaM.ComputeHash(data);
}
Run Code Online (Sandbox Code Playgroud)

将使用SHA256为您做到这一点,并在MSDN上找到.


关于SHA1"破解"的旁注:透视SHA-1的破解

  • @quantum - 当时没有像现在这样多的信息.删除了SHA1并添加了一个链接"将SHA1的破解透视." (5认同)
  • MD5漏洞与密码无关.它允许攻击者创建冲突,前提是他知道原始明文.虽然这对于消息身份验证来说是一件非常糟糕的事情,但这不是密码的问题.(原始明文(希望)对攻击者不可用).另一方面,请参阅http://nsa.unaligned.org/以了解SHA1和MD5密码破解.请注意,他不使用任何算法漏洞......他只是使用SHA1和MD5速度快的事实.任何快速哈希算法(包括SHA256)在没有密钥加强的情况下都是脆弱的. (3认同)
  • @Kyle:我认为,我们一直在谈论离线攻击.否则......我无法看到所声明的MD5和SHA1漏洞在线攻击发挥作用.盐也与在线攻击无关......在线攻击期间无法使用彩虹表. (2认同)

Dar*_*rov 29

SHA1比MD5强,所以如果您有选择,最好使用它.这是一个例子:

public static string CalculateSHA1(string text, Encoding enc)
{
    byte[] buffer = enc.GetBytes(text);
    SHA1CryptoServiceProvider cryptoTransformSHA1 = new SHA1CryptoServiceProvider();
    return BitConverter.ToString(cryptoTransformSHA1.ComputeHash(buffer)).Replace("-", "");
}
Run Code Online (Sandbox Code Playgroud)

  • 你为什么用""代替" - "? (8认同)

Dra*_*788 11

两者都太快而无法直接使用.使用Key Enhance来"减慢"密码散列程序.速度是不幸的密码安全的敌人.

慢到多慢?将密码哈希值从〜微秒减慢到几百毫秒不会对应用程序的感知性能产生负面影响......但是会使密码破解速度慢十万倍.

有关详细信息,请参阅此文章:http: //chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html

问题是MD5很快.它的现代竞争对手也是如此,例如SHA1和SHA256.速度是现代安全散列的设计目标,因为散列几乎是每个密码系统的构建块,并且通常在每个数据包或每个消息的基础上执行需求.

速度正是您在密码散列函数中不想要的.

......剪...

密码攻击游戏在破解密码X时得分.对于彩虹表,该时间取决于您的表需要多大以及搜索速度有多快.对于增量破解程序,时间取决于您运行密码哈希函数的速度.

也就是说,使用BCrypt.最近开发了SCrypt,但我怀疑是否存在任何稳定(或生产就绪)库.从理论上讲,SCrypt声称要改进BCrypt.不推荐使用"构建自己的",但是数千次迭代MD5/SHA1/SHA256应该可以解决问题(即:Key Enhance).

如果您不了解它们,请务必阅读Rainbow Tables.基本安全的东西.


Ahm*_*aid 10

来自MSDN

byte[] data = new byte[DATA_SIZE];
byte[] result; 

SHA1 sha = new SHA1CryptoServiceProvider(); 
// This is one implementation of the abstract class SHA1.
result = sha.ComputeHash(data);
Run Code Online (Sandbox Code Playgroud)