【问题标题】:php mcrypt: why to add spaces on string input?php mcrypt:为什么要在字符串输入上添加空格?
【发布时间】:2012-11-09 17:00:16
【问题描述】:

在几个网站上有一个 mcrypt sn-p:

https://stackoverflow.com/a/11538728/408872

http://www.binrand.com/post/3810303-mcrypt-md5-how-to-create-an-online-encryption-decryption-web-page.html

http://www.techbees.org/best-way-to-use-php-to-encrypt-and-decrypt/

$key = 'password to (en/de)crypt';
$string = ' string to be encrypted '; // note the spaces

$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
$decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted), MCRYPT_MODE_CBC, md5(md5($key))), "\0");

echo 'Encrypted:' . "\n";
var_dump($encrypted);

echo "\n";

echo 'Decrypted:' . "\n";
var_dump($decrypted); // spaces are preserved

有人知道为什么要在 $string 上引入额外的空格吗?

【问题讨论】:

    标签: php spaces mcrypt


    【解决方案1】:

    您提供的所有资源都使用几乎完全相同的代码。我只能假设他们从彼此那里窃取了代码。所以这不是几个站点在这样做,很可能是一个站点,而其他不真正了解发生了什么的人只是继承了这个。

    在加密之前没有好的理由在字符串中添加额外的空格,它不会以任何方式增强密码学的强度,也不会使其“更好”。

    我的猜测是,在这些示例中,已经完成以表明像 trim 这样的函数不会影响加密流的内容。 (我个人不明白为什么需要证明这一点——这对我来说似乎完全合乎逻辑)

    如果您接受 base64 编码的加密数据(可能来自表单提交),您很可能会修剪提交的数据以删除用户留在其中的任何谷壳,我怀疑某处有人担心修剪加密数据会破坏原始明文。

    编辑:

    注意,如果这个字符串不是base64编码的,完全有可能破坏密文。由于密文将以二进制形式表示,因此它的末尾可能会有空白字符,这些字符可能会被修剪掉,从而导致损坏。

    编辑 2:

    md5(key) 作为密钥,md5(md5(key)) 作为初始化向量都是非常糟糕的实现方式。

    首先,AES 256 应该有一个 256 位的密钥。如果您想使用密码,请使用hash('sha256', $passphrase, true)。最后的true 使它以二进制而不是十六进制编码的形式返回结果,这很重要,因此您实际上可以在密钥中获得尽可能多的熵。

    其次,初始化向量永远不应该被重复使用md5(md5(key)) 将始终为相同的键生成相同的值。如果攻击者设法获得多个密文,这会大大削弱您的加密。

    【讨论】:

    • 谢谢@Leigh 我正在考虑...错了?:hash('sha526'... => hash('sha256'
    猜你喜欢
    • 2020-07-15
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 2020-04-30
    • 2015-06-04
    • 2014-12-11
    • 2020-09-16
    • 1970-01-01
    相关资源
    最近更新 更多