Php 你能一遍又一遍地加密加密字符串吗?

Php 你能一遍又一遍地加密加密字符串吗?,php,encryption,Php,Encryption,我想知道您是否可以反复使用md5,或者反复使用sha1,例如: $pass = md5($pass); $pass = sha1($pass); $pass = md5($pass); $pass = md5($pass); 还有它工作吗?因此,它一次又一次地加密加密字符串,因为我想建立一个严格加密的密码系统,这样就没有人可以入侵,我担心我正在创建的这个额外的算法会起作用吗?MD5和SHA1都不是加密算法;它们是单向散列函数。也没有人能“黑客”,因为他们是不可逆的;原始信息丢失了。我们能做的就

我想知道您是否可以反复使用md5,或者反复使用sha1,例如:

$pass = md5($pass);
$pass = sha1($pass);
$pass = md5($pass);
$pass = md5($pass);

还有它工作吗?因此,它一次又一次地加密加密字符串,因为我想建立一个严格加密的密码系统,这样就没有人可以入侵,我担心我正在创建的这个额外的算法会起作用吗?

MD5和SHA1都不是加密算法;它们是单向散列函数。也没有人能“黑客”,因为他们是不可逆的;原始信息丢失了。我们能做的就是伪造一个不同的文本,给出相同的散列;重复的哈希运算既不容易也不困难。

如果您试图对密码进行哈希运算,请查看。不要使用其他任何东西,绝对不要使用自己的系统。

一次散列与多次散列同样安全。这是数学加密算法的一个事实

您真正想做的是在算法中添加一个

此外,多次散列密码可能会导致加密的安全性降低

基本上,这不是一个明智的设计决策,也不是一个好的实践

编辑#1 此外,使用一种尚未严重破解的算法。
我更喜欢咖啡,味道很浓。加上盐,它几乎是无法穿透的。

是的,你的想法很有效,如果实施得当,事实上是一个非常好的想法。看看已经做了什么


但是,我不会使用MD5,而是使用一个哈希函数,对于该函数,没有已知快速查找冲突的算法(例如SHA256)。这样做可以使用Kelsey、Schneier、Hall和Wagner的论文“低熵密钥的安全应用”的结果。特别是定理1显示了一些安全属性,如果使用的哈希函数是强抗冲突的。有一些密码协议的理论支持总是很好的。

有一个很好的理由对密码进行多次(>1000)散列,称为“”:这会使每次密码破解尝试花费更长的时间。然而,现在正确的防御方法是使用scrypt(见我的答案)。为了确保我们在同一页上,彩虹表并不是链条中最薄弱的一环。您需要使用一种需要很长时间来尝试每个密码的算法,以阻止自动密码破解。您的答案与公认的密码哈希加密原则相反。你能证明这一点吗?@greg我不知道你的意思。salt始终是一个好主意,每次对字符串进行哈希运算时,它会将输入池从(本质上)无限减少到之前算法的输出,这有效地增加了冲突的可能性,从而彻底破坏了对密码进行哈希运算的效果。MD5已经被破解了,SHA1已经上路了。我的答案到底有多大程度上违背了散列原理?我提供了一些数据,在谷歌搜索的时间非常短的情况下,这些数据是有效的。你能证明你的评论是正确的吗?我不知道,因为我在谷歌上搜索了一个“md5解密程序”,例如,网站实际上可以成功地解密md5加密,所以我有点担心worried@Ninjiangstar:如果您使用MD5散列您的密码,则说明您做错了。:-)我应该用什么?但如果我真的一遍又一遍地加密一个字符串,它真的会工作吗?@Ninjiangstar:10年前,如果你对密码进行了1000次以上的哈希运算,它可能会工作。现在,你需要做得更好。使用,不要尝试使用你自己的解决方案。@Ninjiangstar:就是说,是一个纯文本/哈希对数据库;如果给它们一个散列,它将查找具有相同散列的明文。这听起来很吓人,但你必须意识到只有5个小写ASCII字符的组合超过1100万个。如果您要求密码为128字符ASCII集合中的任意10个字符,那么他们的数据库将需要保存10^21(10到21次方)项以匹配该值;这意味着超过100000 EB的存储空间。别担心——只要你的密码不是字典上的单词,它们就是安全的。你所做的是散列,而不是加密。“不要使用其他任何东西”。bcrypt怎么样?@GregS:bcrypt也能工作,特别是在需要OpenBSD上的
crypt
兼容性的情况下,但scrypt更好,因为它不仅参数化了工作复杂性(就像bcrypt那样),而且还参数化了所需的内存使用量(这增加了大规模并行硬件破解的成本)。