我正在建立一个网站,我需要一个安全的算法来存储密码。 我第一次想到bcrypt,但后来我发现我的主机不支持它,我无法改变主机。
我的主机允许加密:
这些哈希:
那么,你们中的任何人都可以用这个和一个盐来修复一个好的算法吗?
答案 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)
你应该
答案 3 :(得分:1)
您应该将密码存储为如上所述的哈希值,而不是加密。
散列函数基本上是单向转换,它总是为同一个输入参数生成相同的散列。不应该将散列转换回其原始形式,否则散列函数将被视为已损坏。
加密是一种双向转换,如果您有密钥,可以将加密数据转换回原始格式。
通过将密码存储为哈希值,并且因为它们是单向转换的,即使有人要抓住数据库,也无法提取它们。
检查密码时,只需使用您在存储密码中使用的相同哈希函数对其进行转换,然后检查数据库。
答案 4 :(得分:0)
正如gnur所说,您需要决定是否要对密码进行哈希或加密。如果这些是您自己用户的密码,并且密码仅在您的系统上使用,则使用salt和拉伸对它们进行哈希处理。您可以使用的哈希算法使用SHA-256或SHA-512。对于盐使用128个随机位(16个字节)。理想情况下使用加密RNG虽然非加密RNG会在紧要关头做。无论如何,攻击者都被认为知道盐。足够拉伸,处理单个密码大约需要0.1秒。这限制了任何攻击者每秒破解密码的十次尝试。
如果要存储密码以登录外部系统,则需要加密密码并在需要时对其进行解密。 DES是你唯一真正的选择,除非你还有3DES(又名Triple DES或DESede)。我很惊讶AES / Rijndael不可用。如果它是我们它优先于DES。