在 C# 中我们如何自动使用 SHA1?
SHA1 比 MD5 好吗?(我们对用户名和密码使用散列,并且需要速度进行身份验证)
7 回答
不知道你的意思是自动,但你应该真正使用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的破解
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("-", "");
}
两者都太快了,至少不能直接使用。使用密钥强化来“减慢”密码散列过程。不幸的是,速度是密码安全的敌人。
慢到什么程度才够慢?将密码哈希从〜微秒减慢到〜数百毫秒不会对您的应用程序的感知性能产生不利影响......但会使破解密码实际上慢十万倍。
问题是 MD5 速度很快。它的现代竞争对手也是如此,例如 SHA1 和 SHA256。速度是现代安全散列的设计目标,因为散列是几乎每个密码系统的构建块,并且通常在每个数据包或每个消息的基础上按需执行。
速度正是您在密码哈希函数中不想要的。
...剪断...
密码攻击游戏以破解密码 X 的时间计分。对于彩虹表,该时间取决于您的表需要多大以及搜索速度有多快。使用增量破解程序,时间取决于您可以使密码哈希函数运行多快。
也就是说,使用 BCrypt。SCrypt 是最近开发的,但我怀疑是否存在任何稳定的(或生产就绪的)库。从理论上讲,SCrypt 声称对 BCrypt 进行了改进。不建议“构建自己的”,但迭代 MD5 / SHA1 / SHA256 数千次应该可以解决问题(即:密钥强化)。
如果您不了解它们,请务必阅读 Rainbow Tables。基本的安全东西。
来自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);
使用 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
我想用这些东西。
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("-", "");
}