C# 表中的密码字段应使用什么;MD5还是SHA1?

C# 表中的密码字段应使用什么;MD5还是SHA1?,c#,.net,cryptography,md5,sha1,C#,.net,Cryptography,Md5,Sha1,我决不是安全专家,甚至不是新手。我充其量只是个保安新手 有人建议我使用SHA1而不是MD5——为什么我会选择其中一个呢?一个更安全吗?MD5已被“破坏”,更高级别的安全现在实际上需要SHA-2。这是一本很有趣的书 编辑:晚9秒:)无论您使用哪种方法,请使用盐哈希法 祝你好运。存储便宜,处理器速度快。将1千字节盐与SHA-512配合使用。。Scheier也有一些新功能我至少会使用SHA2(256)-但是: 由于攻击,简单地对数据库中的密码进行哈希运算几乎没有意义。同样,salt散列也更好,但是如果

我决不是安全专家,甚至不是新手。我充其量只是个保安新手

有人建议我使用SHA1而不是MD5——为什么我会选择其中一个呢?一个更安全吗?

MD5已被“破坏”,更高级别的安全现在实际上需要SHA-2。这是一本很有趣的书


编辑:晚9秒:)

无论您使用哪种方法,请使用盐哈希法


祝你好运。

存储便宜,处理器速度快。将1千字节盐与SHA-512配合使用。

。Scheier也有一些新功能

我至少会使用SHA2(256)-但是:

由于攻击,简单地对数据库中的密码进行哈希运算几乎没有意义。同样,salt散列也更好,但是如果有人可以访问您的数据库,那么他们就有可能访问您的代码,在这种情况下,他们可能可以反汇编固定salt。同样,如果你使用随机盐,那么不管怎样,你都会将它存储在行中,因此当它减慢人们的速度时,他们仍然可以用彩虹表攻击它

更好的解决方案是使用随机盐以及随机(高)迭代次数,以便尝试对每个密码进行暴力攻击所需的时间明显更长,因此在物理上更难破解所有密码

我相信.Net可以通过使用PBKDF来实现这一点,但我错放了它的链接(有人向我提供了我刚才问的一个问题的答案)编辑找到了.Net的链接

在MD5上


虽然MD5确实被证明是“坏的”,正如其他答案所提到的,但我不使用它的主要原因——以及为什么我读到它不适合使用——是因为它实际上非常快,从而增加了在给定时间内出现裂缝的可能性。

MD5和SHA1都被认为是不安全的,SHA-1更好。但是,有两件事你应该考虑:

  • 所谓“不安全”,他们的意思是说,从数学上来说,比暴力更容易确定预散列值。有时这意味着他们可以将它从10亿次计算减少到9亿次,其他时候则要少得多。这远没有我的观点2那么不安全

  • 因为您正在创建一个散列,所以黑客很容易通过填充一个充满常用密码的表,并通过相同的散列算法来确定数据库的密码,而不管您使用哪种算法。这叫做彩虹桌

  • 例如,许多人使用“密码”和“约翰”作为他们的密码。在MD5中,这两个密码始终生成: 密码:5f4dcc3b5aa765d61d8327deb882cf99 约翰:527bd5b5d689e2c32ae974c6229ff785

    所以,如果你只是将你的密码MD5,而某人很天真地将其作为自己的密码,那么如果黑客控制了你的数据库并在rainbow表上运行它,那么它可能会受到危害

    但是,如果在每个预散列值中添加某种胡言乱语,如“password12345”和“johnxyz”,则会得到两个完全不同的散列,与上面的散列不同。这称为salt值,它会阻止rainbow表发挥同样的效果

    我的建议是使用编程语言中可以使用的最高级别的SHA算法,并使用哈希密码对存储在数据库记录中的salt值进行哈希(如果愿意,可以通过哈希当前时间创建“随机”值)

    DB列:用户名|密码|盐


    这不是任何人想到过的最安全的系统,但它很可能适用于您的系统。

    当心那些声称哈希算法“坏了”或“有缺陷”而没有说明算法有缺陷的原因的“cargo cult”回答。如果在数据库中存储普通的SHA-1密码散列,您的方法与MD5一样有缺陷(请参阅)。我相信,在将用户密码安全存储在数据库中的用例中,生成哈希冲突所需的时间不是很重要。正确的答案是使用salt,keyed hash,PBKDF2等+1-这是一个很好的例子,一个表面上看起来完全无辜的小问题,但实际上是一个进入一个更大、非常黑暗和非常重要的雷区的极好入口。密码很愚蠢。如果您想要明确(尽管未经验证)的安全性,则应使用客户端证书。无论攻击者获得您的数据库后,密码总是会被破坏,例如,如果他控制了正确的位置,他可以设置一个记录器来记录密码,然后再根据数据库对其进行加密和检查。或者他可以对散列进行并行暴力攻击。再说一次,一旦攻击者拥有你的基础设施中的任何东西,你基本上就完蛋了。@Longpoke——给你:我的密码哈希是2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、2、3、3、2、2、3、2、2、3、2、2、2、2、2、2、2、3、2、2、3、2、2、2、2、3、2、2、2、3、2、3、2、2、2、2、3、3、3、2、2、2、2、3、2、2、3、3、3、2、2、2、3、2、2、3、2、3、2、3、2、3、2、2、2、2、3、2、2、2、2、2、3、2、3、3、3、3 YN4WGCUA==“。其计算时间为{00:00:00.4656027}。这是一个可以在英语词典中找到的词。如果你能在合理的时间内说出我的密码,我真的很感动:)@Longpoke:3行C代码,只使用标准的.NET类。如果这是“太多的工作”,那么我想我已经证明了这三条线足以保护我的资产。如果您还想尝试,下面是“A”的散列:“3zyme1yzhl8bff6x99xdbspbm18givbckaau561gdthcmiwt2urk8z88l8f9sdayjfpfji06wl3 g5i4HlaAGTP4+adkwhpasfvqqzkjvwpopke40h6d7crk3xnkjaf5bzgfeiqupa0okmuyrzuu YA19ypJjo4+mz++6eJbjD4/hhhkffrpiezttw6eby3x4py9bur+