我正在处理一个应用程序而且我需要存储用户密码,所以我想我会将它存储在注册表的当前用户类中,但我也想将它哈希,原因很明显,我已经看到新闻项目表明SHA1已被破解,“标准”系统或.net中是否有更好的(未破解的)散列算法?
答案 0 :(得分:11)
SHA1不是encryption,而是cryptographic hash function。是的它已被打破,这意味着可以比蛮力方法更快地产生碰撞。 SHA2系列尚未破解。
但我建议每个条目使用一个自定义种子,以便rainbow table不能用于尝试密码。如果您正在使用SQL成员资格提供程序,则password format "Hashed"已为每个用户使用不同的种子。
有关播种哈希的更多信息,请参阅Thomas Ptacek撰写的文章What You Need To Know About Secure Password Schemes。
答案 1 :(得分:2)
正如您在评论中所说,SHA1是一种哈希算法,而不是加密算法。它是一个单向函数,即使它被破坏,也不允许检索密码。
如果你想要更强大的已经在.NET中的哈希函数,请查看SHA2系列 - SHA256,SHA384,SHA512。 (SHA224也存在,但未在System.Security.Cryptography命名空间中实现。)
对SHA1的碰撞攻击尚未实际可利用,但你向前看是正确的。鉴于这些攻击,NIST目前正在针对SHA3进行选择,但这是从完成和商业接受后的几年。另一方面,SHA2是现有的算法系列,由NIST标准化,不受针对MD5和SHA1的攻击。</ p>
答案 2 :(得分:1)
您需要做的是salt您的密码。以下是C#中使用SHA1和salting的实际sample code。
SHA1“被破解”的问题是所有基本的可能组合都已经预先计算过了,但是腌制使你的密码非基本(如果它很弱或很容易猜到但它会杀死彩虹表,它仍然容易受到暴力攻击)
答案 3 :(得分:1)
Hash算法最近显示出weakness的一些迹象,这就是NIST提供hashing contest的原因,就像他们加密竞赛一样加冠Rijndael为新AES
我个人喜欢MD6提供的内容,因为Ron Rivest已经在密码学领域工作了三十多年。 MD6已被撤回,所以我认为第二轮中一些较为强势的候选人在我看来是Keccak,Blue Midnight Wish和Fugue。
从那里,绝对要使用盐渍等良好做法。
答案 4 :(得分:0)
是的,您可以使用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算法,here's a short list.
答案 5 :(得分:-5)
5天太晚了,但你可以尝试这种高度安全的加密功能:
uint64_t highly_secure_encrypt(char* password) {
sleep(1);
return 0;
}
你无法从中获取密码。
现在,处理严肃的事情。如果您还不知道问题的答案,则不应设计安全系统。
如果您将密码存储在注册表的当前用户部分中,那么唯一可以访问它的人(在正常情况下)是用户和管理员。我(在某种程度上)信任注册表的当前用户部分,并使用操作系统提供的标准密码散列机制。
Jeff Atwood的"Rainbow Hash Cracking"描述了哈希和密码存储的初学者细节,Thomas Ptacek的"Enough With the Rainbow Tables: What You Need to Know About Secure Password Schemes"继续告诉你为什么你不应该自己尝试自己做。
选择好的哈希函数不到战斗的1%。如果攻击者每秒可以运行数百万次哈希函数,那么他可以每秒测试数百万个组合。您需要的是一个缓慢,可调的安全散列。这不是很容易实现的东西,SHA *,MD5等设计得很快,因为它们通常用于文件和文件块,速度为王。
我建议阅读更多,因为答案很容易找到。