良好的加密哈希函数

时间:2011-08-15 17:03:20

标签: php hash passwords crypt

  

可能重复:
  Secure hash and salt for PHP passwords

我正在建立一个网站,我需要一个安全的算法来存储密码。 我第一次想到bcrypt,但后来我发现我的主机不支持它,我无法改变主机。

我的主机允许加密:

  • 标准DES

这些哈希:

  • MD5
  • md2,md4& MD5
  • sha1,sha256,sha384& SHA512
  • ripemd128,ripemd160,ripemd256和ripemd360
  • 漩涡
  • tiger128,3,tiger160,3,tiger192,3,tiger128,4,tiger160,4& tiger192,4
  • snefru
  • GOST
  • 的Adler32
  • 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,haval224,5& haval256,5

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

5 个答案:

答案 0 :(得分:8)

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

供参考,以下是列出的哈希的分类(详见wikipedia):

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

请注意,强度是指查找与已知哈希匹配的任何密码(preimage attack)的攻击。此外,上述排序是偏执的,立即丢弃任何已知漏洞的任何哈希。

答案 1 :(得分:1)

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

在一个不太严肃的说明中,我曾经记得在缓慢的服务器上使用盐腌MD5,预计会有中等负荷。所以我决定用32位随机盐填充它,并将整个东西存储为十六进制 - 它给人的印象是整个东西都是无盐的SHA-1。我真诚地希望有人浪费宝贵的时间在被盗的垃圾场上运行彩虹桌!

安全并不是所有关于更昂贵的哈希:)

答案 2 :(得分:1)

你应该

  • 使用salt作为哈希的一部分。
  • 在10,000+迭代范围内使用迭代例程。例如,PBKDF#2。
  • 使用已知的强散列(SHA-256,SHA-512)

答案 3 :(得分:1)

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

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

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

通过将密码存储为哈希值,并且因为它们是单向转换的,即使有人要抓住数据库,也无法提取它们。

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

答案 4 :(得分:0)

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

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