2011-08-15 49 views
7

可能重复:
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

因此,可以有人对你修复好的算法与和盐,请吗?

+2

你想要什么?加密还是哈希?另外,md5是散列,而不是加密。 – gnur

+0

检查出http://stackoverflow.com/search?q=php+store+passwords,它必然会有很好的信息 –

+2

阅读[本答案](http://stackoverflow.com/questions/4948322/fundamental-difference-之间散列和加密的算法/ 4948393#4948393)。使用sha256或sha512,迭代并完成它... – ircmaxell

回答

8

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

仅供参考,这里列出的散列的分类(详见wikipedia):

加密(不是哈希函数):DES
非密码校验(可笑):的Adler32 ,CRC32,crc32b
破碎:MD2,MD4,MD5,SHA1
可能打破:虎,snefru,GOST,HAVAL *
可能是安全:SHA2-256/384/512,RIPEMD-128/256,RIPEMD-160/320中,WHIRLPOOL

注意,强度是指发现匹配的公知的散列任何密码的攻击(原像攻击)。此外,上述排序是偏执狂,立即丢弃任何散列任何已知漏洞。

+0

该问题提到哈希和盐... – geoffspear

+0

有时需要存储加密的密码,以便能够登录到外部系统。 – rossum

+0

@rossum在这些情况下,您应该使用单点登录解决方案。您不会以明文形式存储密码,以防止攻击者在系统数据受损的情况下登录。由于加密密钥是系统数据的一部分,因此加密通常毫无意义,除非密钥和数据位于不同的安全域中。 – phihag

1

crc32,adler32等没有设计为加密安全 - 它们只是快速校验和算法。我认为腌制的SHA-256应该提供安全性和兼容性的完美结合。

在一个稍微不太严重的说明中,我曾经记得在一台缓慢的服务器上使用盐腌MD5,预计该服务器可以承受中等负载。所以我决定用一个32位的随机盐来填充它,并将整个东西存储为十六进制 - 它给人留下了整个事情没有影响的SHA-1的印象。我真心希望有人浪费宝贵的时间在被盗的垃圾场上跑彩虹桌!

安全不是真正意义的更昂贵的散列:)

+0

通过隐藏(填充方法确实是)的安全性不是安全性。它可能会让你在夜间感觉好一点,但最终并不能真正让它更安全。当你将它与破解时间的概念相结合时(它会,只需要时间),由于更容易的散列,每个人的密码将更容易暴力破解。在大多数实现中,md5实际上比sha1或sha256要慢......所以我不知道你想要达到什么效果(并且你错过了很长的一段时间)... – ircmaxell

1

你应该

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

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

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

+1

DES是**从不* *这个年龄段的选择。在PHP land中使用[实现Rijndael(AES)](https://github.com/ircmaxell/PHP-CryptLib/blob/master/lib/CryptLib/Cipher/Block/Cipher/Rijndael.php)比使用更好DES非常细碎... – ircmaxell

1

您应该将密码存储为散列,如上所述,未加密。

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

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

通过将密码存储为散列,并且由于它们是单向转换的,即使有人要获取数据库也无法提取它们。

在检查密码时,只需使用您在存储的密码上使用的相同散列函数进行转换,并检查数据库。