简单密码加密

18

在保护数据库中的密码时,有哪些简单有效的加密方案呢?我并不需要非常高级和超级安全的加密方式,也不需要速度超快的方案,但是这些特性当然是好的。主要上,我需要一种易于实现、不会太慢或不安全的方案。


Jeff的文章你可能在错误地存储密码是关于这个话题的绝佳阅读材料。 - Greg Hewgill
11个回答

15

正如mk所说,SHA1或MD5是标准的哈希函数,以及SHA2


更新:随着处理器速度越来越快,哈希运算变得更容易受到暴力破解,现在建议使用bcrypt

另一个更新:虽然bcrypt仍然可能很好,但如果我今天要编写一个新系统,我会使用scrypt


您想要的更一般地称为加密哈希函数。加密哈希函数旨在是单向的(给定结果哈希值,不应该能够推导出原始输入)。此外,任意两个字符串具有相同哈希值(称为哈希冲突)的可能性应该很低(理想情况下为哈希值数量的1/)。

不幸的是,即使您的密码已被散列,也不能使您摆脱努力保护散列版本的需求。太多人会使用弱密码,这些密码容易受到离线暴力破解攻击。

编辑 - 一些人已经指出使用盐的重要性。盐是一个常量值,您在使用哈希函数之前将其与输入混合。具有唯一盐值可以防止离线攻击者使用预先计算好的常见密码表(彩虹表),以更快地进行暴力破解。


2
对于OP:当使用MD5或SHA1/2等单向哈希时,您无法“解密”它。也就是说,您将无法从哈希字符串中恢复原始明文密码。要在用户登录时测试密码,请将相同的哈希应用于输入的密码并比较两个哈希值。 - Barry Brown

10

如果您使用MD5或SHA1,请使用盐来避免彩虹表攻击。

在C#中,这很容易实现:

MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
string addSalt = string.Concat( "ummm salty ", password );
byte[] hash = hasher.ComputeHash( Encoding.Unicode.GetBytes( addSalt ) );

10

10

3
使用 SHA 单向哈希算法以及唯一的盐值来存储密码在数据库中。

0

对于不可逆加密,我肯定会选择SHA256或SHA1。MD5现在有很多碰撞,并且已经投入了大量的努力来破解它,因此不是一个好的选择。


0
如果您想要为您的解决方案考虑未来,我建议使用SHA256或SHA512。密码学极客世界对MD5感到紧张,对SHA1的担忧稍微轻微一些。
或者,如果可以的话,等待SHA-3的发布可能是一个好的选择。

0
我认为更好的安全性关键是使用动态盐。这意味着为每个新用户生成一个随机字符串,并使用该字符串来加盐哈希值。当然,您需要将此盐存储在数据库中,以便稍后验证密码(我不会以任何方式加密它)。

0

0

我赞成使用带有盐的MD5或SHA。任何主要的Web开发语言都内置了计算哈希值的功能(例如,在PHP中,mcrypt软件包包含必要的函数)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接