在保护数据库中的密码时,有哪些简单有效的加密方案呢?我并不需要非常高级和超级安全的加密方式,也不需要速度超快的方案,但是这些特性当然是好的。主要上,我需要一种易于实现、不会太慢或不安全的方案。
在保护数据库中的密码时,有哪些简单有效的加密方案呢?我并不需要非常高级和超级安全的加密方式,也不需要速度超快的方案,但是这些特性当然是好的。主要上,我需要一种易于实现、不会太慢或不安全的方案。
正如mk所说,SHA1或MD5是标准的哈希函数,以及SHA2。
更新:随着处理器速度越来越快,哈希运算变得更容易受到暴力破解,现在建议使用bcrypt
。
另一个更新:虽然bcrypt
仍然可能很好,但如果我今天要编写一个新系统,我会使用scrypt
。
您想要的更一般地称为加密哈希函数。加密哈希函数旨在是单向的(给定结果哈希值,不应该能够推导出原始输入)。此外,任意两个字符串具有相同哈希值(称为哈希冲突)的可能性应该很低(理想情况下为哈希值数量的1/)。
不幸的是,即使您的密码已被散列,也不能使您摆脱努力保护散列版本的需求。太多人会使用弱密码,这些密码容易受到离线暴力破解攻击。
编辑 - 一些人已经指出使用盐的重要性。盐是一个常量值,您在使用哈希函数之前将其与输入混合。具有唯一盐值可以防止离线攻击者使用预先计算好的常见密码表(彩虹表),以更快地进行暴力破解。
如果您使用MD5或SHA1,请使用盐来避免彩虹表攻击。
在C#中,这很容易实现:
MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
string addSalt = string.Concat( "ummm salty ", password );
byte[] hash = hasher.ComputeHash( Encoding.Unicode.GetBytes( addSalt ) );
对于不可逆加密,我肯定会选择SHA256或SHA1。MD5现在有很多碰撞,并且已经投入了大量的努力来破解它,因此不是一个好的选择。
我赞成使用带有盐的MD5或SHA。任何主要的Web开发语言都内置了计算哈希值的功能(例如,在PHP中,mcrypt软件包包含必要的函数)。