我可以从网上读到:Blowfish算法是对称的。而从PHP.net crypt函数是一种加密方式。Crypt函数也允许Blowfish作为哈希算法。
所以当我把对称加密和双向加密过程联系起来时,如果我是正确的。我看到了矛盾
当然,使用crypt() + Blowfish将给某人解密字符串的机会,如果他知道秘盐的话?(我实际上认为没有,因为我可以从加密字符串中看到加密盐是包括在内的)
多谢
像blowfish这样的密码算法可以用作哈希算法的一部分。河豚只是一个"积木",可以用于不同的目的。它可以作为加密/解密工具实现,也可以作为哈希算法的加密原语实现。这并不意味着你可以突然反转一个散列算法。
哈希算法的输出总是一个常数长度,这是一个明显的事实,它不能被逆转。您不能以可逆的方式将无限数量的潜在输入值加密为固定长度的输出。该算法必然是有损的。
作为一个简单的例子,河豚可以这样使用加密数据(随后可以解密):ABCD EFGH IJKL MNOP ...
| | | |
v v v v
NPCQ JQ0C MPZW LKAQ
输入的每个块由河豚逐个转换成密文。这就是为什么blowfish被称为块密码(与流密码相反,流密码将输入作为一个流处理,而不是作为一组固定长度的块)。这个操作的结果是一堆可以反转的块。输出长度与输入长度相同(必要时加上填充块)。
使用blowfish的哈希函数是这样工作的:
ABCD EFGH IJKL MNOP ...
| | | |
v v v v
NPCQ JQ0C MPZW LKAQ
| | | |
+----+--> PMQZ --+--> OLMQ --+--> UALG ...
每个区块的输出通过压缩函数运行,该函数将两个区块合并为一个。将前两个块的输出组合(变为PMQZ
),然后将该值与第三个块的输出组合(变为OLMQ
),依此类推。最后一次压缩的输出是哈希的结果。
如您所见,blowfish在内部被用作加密密码,但它的输出与有损压缩函数相结合,这使得无法反转输出。
加密的东西是可解密的,如果不能解密就叫做哈希,哈希是单向的
你想错了;盐和密码一起用作密钥,而有一个魔术字符串作为数据(密码不是数据)。没有密钥,就无法解密。然后对其进行迭代(这就是bcrypt所做的)。
参考sha512 vs blowfish vs bcrypt的答案。