从哪里出现这些空字节?

时间:2013-08-20 10:07:56

标签: php session cookies null mcrypt

对于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()来解决这个问题,但我想知道如何解决这个问题。

谢谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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