比SHA1更好的散列

我正在处理一个应用程序,我需要存储用户密码,所以我想我会将它存储在注册表的当前用户类中,但我也想把它哈希,原因很明显,我已经看到新闻项目表明SHA1已被破解,“标准”系统或.net中是否有更好的(未破解的)散列算法?

SHA1不是加密 ,它是加密哈希函数 。 是的它已被打破,这意味着可以比蛮力方法更快地产生碰撞。 SHA2系列尚未破损。

但我建议每个条目使用一个自定义种子,以便彩虹表不能用于尝试密码。 如果您正在使用SQL成员资格提供程序,则密码格式“Hashed”已为每个用户使用不同的种子。

有关播种哈希的详细信息,请参阅Thomas Ptacek撰写的有关安全密码方案的内容。

正如您在评论中所说,SHA1是哈希算法,而不是加密。 它是一个单向函数,即使它被破坏,也不允许检索密码。

如果您想要更强大的已经在.NET中的哈希函数,请查看SHA2系列 – SHA256,SHA384,SHA512。 (SHA224也存在,但未在System.Security.Cryptography命名空间中实现。)

对SHA1的碰撞攻击尚未实际可利用,但你向前看是正确的。 鉴于这些攻击,NIST目前正在针对SHA3进行选择,但这是从完成和商业接受后的几年。 另一方面,SHA2是由NIST标准化的现有算法族,不受针对MD5和SHA1的成功攻击。

你需要做的就是给密码加盐 。 以下是C#中使用SHA1和salting的一些实际示例代码 。

SHA1“被破解”的问题是所有基本的可能组合都已经预先计算过,但是salting会使你的密码非基本(如果它很弱或很容易猜到但它会杀死彩虹表,它仍然容易受到暴力攻击)

哈希算法最近已经出现了一些弱点 ,这就是为什么NIST提供了一个哈希竞赛 ,就像他们有一个加密竞赛一样,它将Rijndael加入了新的AES 。

我个人喜欢MD6提供的东西,因为它是由Ron Rivest带头的,他已经在密码学领域工作了三十多年。 MD6已被撤回,所以我建议第二轮中一些较强的候选人,我的拙见是Keccak,Blue Midnight Wish和Fugue。

从那里,肯定使用盐渍等良好做法。

是的,您可以使用SHA512,只需记住实际哈希的长度。 您也可以通过盐化哈希结果来添加额外的安全性。

SHA512("The quick brown fox jumps over the lazy dog") = 07e547d9 586f6a73 f73fbac0 435ed769 51218fb7 d0c8d788 a309d785 436bbb64 2e93a252 a954f239 12547d1e 8a3b5ed6 e1bfd709 7821233f a0538f3d b854fee6 

如果你想查看其他Hashing算法, 这里有一个简短的列表。

5天太晚但您可以尝试这种高度安全的加密function:

 uint64_t highly_secure_encrypt(char* password) { sleep(1); return 0; } 

你无法从中获取密码。

现在,处理严肃的事情。 如果您还不知道问题的答案,则不应该设计安全系统。

如果您将密码存储在注册表的当前用户部分中,那么唯一可以访问它的人(在正常情况下)是用户和管理员。 我(在某种程度上)信任注册表的当前用户部分,并使用操作系统提供的标准密码散列机制。

杰夫阿特伍德的“彩虹哈希破解”描述了哈希和密码存储在一个很好的初学细节,托马斯Ptacek的“足够与彩虹表:你需要知道的安全密码方案”继续告诉你为什么你不应该尝试做通常是你自己。

选择一个好的哈希函数不到战斗的1%。 如果攻击者可以每秒数百万次运行哈希函数,那么他可以每秒测试数百万个组合。 您需要的是一个缓慢,可调的安全散列。 这不是很容易实现的东西,SHA *,MD5等设计得很快,因为它们通常用于文件和文件块,速度为王。

我建议阅读更多,因为答案在那里很容易找到。