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

在C#中我们如何自动使用SHA1?
SHA1是否优于MD5?(我们使用哈希来获取用户名和密码,并需要速度进行身份validation)

不确定你的意思是自动,但你应该使用SHA256及更高版本。 也总是在哈希中使用Salt ( 代码 )。 一个侧面说明,经过一段时间后,使用硬化哈希比使用基于速度的简单哈希函数要好得多。 即:散列几百次迭代,或者使用已经证实的散列函数,例如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("-", ""); } 

两者都太快而无法直接使用。 使用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。 基本安全的东西。

来自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); 

我想用这些东西。

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

Othere HashAlgorithms。感谢Darin Dimitrov。

 public static string MD5Of(string text) { return MD5Of(text, Encoding.Default); } public static string MD5Of(string text, Encoding enc) { return HashOf(text, enc); } public static string SHA1Of(string text) { return SHA1Of(text, Encoding.Default); } public static string SHA1Of(string text, Encoding enc) { return HashOf(text, enc); } public static string SHA384Of(string text) { return SHA384Of(text, Encoding.Default); } public static string SHA384Of(string text, Encoding enc) { return HashOf(text, enc); } public static string SHA512Of(string text) { return SHA512Of(text, Encoding.Default); } public static string SHA512Of(string text, Encoding enc) { return HashOf(text, enc); } public static string SHA256Of(string text) { return SHA256Of(text, Encoding.Default); } public static string SHA256Of(string text, Encoding enc) { return HashOf(text, enc); } public static string HashOf(string text, Encoding enc) where TP: HashAlgorithm, new() { var buffer = enc.GetBytes(text); var provider = new TP(); return BitConverter.ToString(provider.ComputeHash(buffer)).Replace("-", ""); } 

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

在此处输入图像描述