欺骗黑客认为加密是md5,而事实并非如此,这是一个好主意吗


Is it a good/clever idea to trick a hacker into thinking an encryption is md5, when it is not?

$clear_text = "hello";
$salt_ = sha1("758hF4H7gJi98U6o");
$salt = substr($salt_, 0, 12);
$hash = substr(hash("sha512", $clear_text), 0, 20).$salt;

如您所见,$hash生成一个32个字符的字符串,使其看起来与md5相同。因此,黑客将试图解密这个md5哈希,而事实上它根本不是这样的!这会是一个狡猾的主意吗?

不要试图发明自己的加密货币,使用标准化的哈希算法,如bcrypt、scrypt或PBKDF2。

请参阅:

  • https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords
  • https://security.stackexchange.com/questions/18197/why-shouldnt-we-roll-our-own

安全中有一个原则被称为Kirckhoff原则,其中一条规则是"它不能被要求是秘密的,而且必须能够落入敌人手中而不会给你带来不便"。建议攻击者可以访问你的机器,并能够转储你的源文件和数据库——他不会花很长时间发现你的算法。

现在,你自己的滚动算法并不能真正提供任何额外的保护,免受正常的sha512+盐的影响。无论有没有你的算法,他攻击哈希的速度都是一样的。这意味着一旦找到算法,你的方案就毫无用处了。

$salt_ = sha1("758hF4H7gJi98U6o");

散列熵不能提供更好的熵。请参阅什么应该用作盐?。摘要:编码一个独特且不可预测的值。

$hash = substr(hash("sha512", $clear_text), 0, 20).$salt;

您应该使用多次哈希迭代。请参阅如何安全地哈希密码。摘要:PBKDF2、BCrypt、SCrypt提供了此功能。

这会是狡猾的吗

不,如果你的代码也被阅读了,那基本上就无关紧要了。

是个好主意吗

对于任何将来必须维护它的人来说,这更可能是一个麻烦。从表面上看,改变哈希格式可能会让人感到困惑,这可能不是一个糟糕的想法,但你可以在阅读《模糊的有效作用》时考虑到这一点。如果你要更改哈希格式,那么就要花精力对其进行加密,这样它就不会在没有加密密钥的情况下受到攻击。寻找钥匙的努力可能是一样的,但这将是一个更容易辩护的决定。