【问题标题】:From where are these null bytes appearing?这些空字节是从哪里出现的?
【发布时间】:2013-08-20 18:51:09
【问题描述】:

对于 API 测试套件,我使用以下代码来加密保存用户密码:

$encryptionKey = sha1(microtime(true) . mt_rand(PHP_INT_MAX / 10, PHP_INT_MAX));
setcookie('key', $encryptionKey, 0);

$_SESSION['username'] = $_POST['username'];
$_SESSION['encryptedPassword'] = mcrypt_encrypt(MCRYPT_BLOWFISH, $encryptionKey, $_POST['password'], MCRYPT_MODE_ECB);

要找回密码,我使用以下代码:

$password = mcrypt_decrypt(MCRYPT_BLOWFISH, $_COOKIE['key'], $_SESSION['encryptedPassword'], MCRYPT_MODE_ECB);

似乎有时五个空字节会附加到存储的值中。因此,var_dump($password) 返回以下内容:

string(8) "123"

var_export($password) 返回以下内容:

'123' . "\0" . '' . "\0" . '' . "\0" . '' . "\0" . '' . "\0" . ''

请注意,我们看到 三个 字符,但 var_dump() 坚持认为有 八个。现在我正在使用trim() 来解决这个问题,但我想知道如何解决这个问题。

谢谢。

【问题讨论】:

    标签: php session cookies null mcrypt


    【解决方案1】:

    大多数加密算法(包括这个)都适用于固定块大小,通常为 8 个字节。所以在这种情况下实际编码的值 123\0\0\0\0\0(这实际上有点不寻常,许多加密算法使用填充大小作为填充 - 例如123\5\5\5\5\5

    【讨论】:

      【解决方案2】:

      考虑将模式从 ECB 更改为更安全的模式,例如 CBC。要删除填充,您可以使用 rtrim($decryptedtext, "\0")。看看example。这是默认的 0 填充,如前所述,加密数据用 0 填充以匹配块的大小。您可以在加密之前添加 PKCS7 填充,您可以找到示例 here

      【讨论】:

        猜你喜欢
        • 2016-07-23
        • 2022-06-17
        • 2019-11-18
        • 2021-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多