25

在 C# 中我们如何自动使用 SHA1?
SHA1 比 MD5 好吗?(我们对用户名和密码使用散列,并且需要速度进行身份验证)

4

7 回答 7

35

不知道你的意思是自动,但你应该真正使用SHA256和更高。还要始终 使用 Salt ( code ) 与您的哈希。附带说明一下,经过一段时间后,使用强化散列远比使用基于速度的普通散列函数好得多。即:散列数百次迭代,或使用已经证明的散列函数,例如bcrypt(我相信下面会提到)。在 .NET 中使用 SHA256 哈希函数的代码示例如下:

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

using(SHA256 shaM = new SHA256Managed()) {
    result = shaM.ComputeHash(data);
}

将使用 SHA256 为您解决问题,可在MSDN中找到。


SHA1“破解”的旁注:透视SHA-1的破解

于 2009-11-18T14:03:39.927 回答
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("-", "");
}
于 2009-11-18T14:05:01.653 回答
11

两者都太快了,至少不能直接使用。使用密钥强化来“减慢”密码散列过程。不幸的是,速度是密码安全的敌人。

慢到什么程度才够慢?将密码哈希从〜微秒减慢到〜数百毫秒不会对您的应用程序的感知性能产生不利影响......但会使破解密码实际上慢十万倍。

查看这篇文章了解详情: 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 数千次应该可以解决问题(即:密钥强化)。

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

于 2010-08-26T19:38:07.673 回答
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);
于 2009-11-18T14:03:28.413 回答
1

使用 SHA1 或 SHA2 的 MD5 算法是有问题的。

http://userpages.umbc.edu/~mabzug1/cs/md5/md5.html http://msdn.microsoft.com/en-us/library/system.security.cryptography.md5%28v=vs.85% 29.aspx

于 2011-10-17T06:01:16.170 回答
1

我想用这些东西。

MD5、SHA1/256/384/512,带有可选的编码参数。

其他哈希算法。感谢Darin Dimitrov

public static string MD5Of(string text)
{
    return MD5Of(text, Encoding.Default);
}
public static string MD5Of(string text, Encoding enc)
{
    return HashOf<MD5CryptoServiceProvider>(text, enc);
}
public static string SHA1Of(string text)
{
    return SHA1Of(text, Encoding.Default);
}
public static string SHA1Of(string text, Encoding enc)
{
    return HashOf<SHA1CryptoServiceProvider>(text, enc);
}

public static string SHA384Of(string text)
{
    return SHA384Of(text, Encoding.Default);
}
public static string SHA384Of(string text, Encoding enc)
{
    return HashOf<SHA384CryptoServiceProvider>(text, enc);
}

public static string SHA512Of(string text)
{
    return SHA512Of(text, Encoding.Default);
}
public static string SHA512Of(string text, Encoding enc)
{
    return HashOf<SHA512CryptoServiceProvider>(text, enc);
}

public static string SHA256Of(string text)
{
    return SHA256Of(text, Encoding.Default);
}
public static string SHA256Of(string text, Encoding enc)
{
    return HashOf<SHA256CryptoServiceProvider>(text, enc);
}

public static string HashOf<TP>(string text, Encoding enc)
    where TP: HashAlgorithm, new()
{
    var buffer = enc.GetBytes(text);
    var provider = new TP();
    return BitConverter.ToString(provider.ComputeHash(buffer)).Replace("-", "");
}
于 2014-02-11T13:51:37.513 回答
0

MD5 性能更好,SHA1 安全性更好。你可以从这个比较中得到一个想法

在此处输入图像描述

于 2016-05-15T07:05:07.130 回答