9

可能重复:
PHP 密码的安全哈希和盐

我正在制作一个网站,我需要一个安全的算法来存储密码。我首先想到的是 bcrypt,但后来我发现我的主机不支持它并且我无法更改主机。

我的主机允许这种加密:

  • 标准 DES

这些哈希值:

  • MD5
  • md2、md4 和 md5
  • sha1、sha256、sha384 和 sha512
  • 成熟的md128、成熟的md160、成熟的md256和成熟的md360
  • 漩涡
  • Tiger128,3、tiger160,3、tiger192,3、tiger128,4、tiger160,4 和tiger192,4
  • 斯内弗鲁
  • 哥特
  • 阿德勒32
  • crc32 & crc32b
  • haval128,3, haval160,3, haval192,3, haval224,3, haval256,3, haval128,4, haval160,4, haval192,4, haval224,3, haval256,4, haval128,5, haval160,5, haval192, 5、哈弗224,5&哈弗256,5

那么,你们中的任何人都可以用它和盐来修复一个好的算法吗?

4

5 回答 5

9

您根本不应该存储加密(甚至未加密)的密码。相反,使用加盐哈希(拉伸,例如使用PBKDF2),最好是 SHA2-512。

作为参考,这里是列出的哈希的分类(有关详细信息,请参阅维基百科):

加密(不是哈希函数):DES
非加密校验和(可笑):adler32、crc32、crc32b
损坏:MD2、MD4、MD5、SHA1
可能损坏:Tiger、snefru、GOST、HAVAL*
可能安全:SHA2-256/384 /512、RIPEMD-128/256、RIPEMD-160/320、惠而浦

请注意,强度是指找到与已知哈希匹配的任何密码的攻击(原像攻击)。此外,上述排序是偏执的,会立即丢弃具有任何已知漏洞的任何散列。

于 2011-08-15T17:07:30.723 回答
1

crc32、adler32 等并非设计用于加密安全——它们只是快速校验和算法。我认为盐渍 SHA-256 应该提供安全性和兼容性的良好组合。

稍微不那么严肃的一点是,我曾经记得在一个预计会承受中等负载的慢速服务器上使用盐渍 MD5。所以我决定用 32 位随机盐填充它,并将整个内容存储为十六进制 - 它给人的印象是整个内容是未加盐的 SHA-1。我真诚地希望有人浪费宝贵的时间在被盗的垃圾场上运行彩虹表!

安全性并不是所有关于更昂贵的散列:)

于 2011-08-15T17:09:36.837 回答
1

你应该

  • 使用盐作为哈希的一部分。
  • 在 10,000+ 次迭代范围内使用迭代例程。例如,PBKDF#2。
  • 使用已知的强哈希(SHA-256、SHA-512)
于 2011-08-15T17:09:56.243 回答
1

您应该将密码存储为如上所述的哈希值,而不是加密。

散列函数基本上是一种单向转换,它总是为相同的输入参数产生相同的散列。应该不可能将散列转换回其原始形式,否则散列函数将被视为已损坏。

加密是一种双向转换,如果您拥有密钥,您可以将加密数据转换回其原始形式。

通过将密码存储为哈希,并且由于它们是一种转换方式,即使有人掌握了数据库也无法提取它们。

检查密码时,只需使用与存储密码相同的哈希函数对其进行转换,然后检查数据库。

于 2011-08-15T17:34:00.550 回答
0

正如 gnur 所说,您需要决定是否要散列或加密密码。如果这些是您自己的用户的密码并且这些密码仅在您的系统上使用,那么使用盐和拉伸对它们进行哈希处理。在您可用的哈希算法中,使用 SHA-256 或 SHA-512。对于盐,使用 128 个随机位(16 个字节)。理想情况下使用加密 RNG,尽管非加密 RNG 会在紧要关头使用。假设攻击者无论如何都知道盐。拉伸到足以处理一个密码大约需要 0.1 秒。这将任何攻击者限制为每秒十次尝试破解密码。

如果您要存储密码以登录外部系统,则需要加密密码并在需要时对其进行解密。DES 是您唯一真正的选择,除非您也有 3DES(又名 Triple DES 或 DESede)可用。我很惊讶 AES/Rijndael 不可用。如果是,那么我们优先于 DES。

于 2011-08-15T17:15:39.250 回答