2013-08-20 83 views
1

對於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()來解決這個問題,但我想知道如何解決這個問題。

謝謝。

回答

1

大多數加密算法(包括這個算法)都適用於固定塊大小,通常爲8個字節。所以說在這種情況下實際的編碼值是123\0\0\0\0\0(這實際上是有點不同尋常,許多加密算法使用的填充大小的填充 - 例如123\5\5\5\5\5

1

考慮從ECB改變模式,以更安全的方式像CBC 。要刪除填充,你可以使用rtrim($ decryptedtext,「\ 0」)。看看example。這是默認的0填充,如前所述,加密數據填充0以匹配塊的大小。您可以在加密之前添加PKCS7填充,您可以找到示例here