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);

格納された値に 5 つのヌル バイトが追加される場合があるようです。したがって、var_dump($password)以下を返します。

string(8) "123"

var_export($password)以下を返します。

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

3 つの文字が表示されますが、 8 つvar_dump()あると主張していることに注意してください。現在、この問題を回避するために使用していますが、この問題を解決する方法を知りたいです。trim()

ありがとうございました。

4

2 に答える 2

1

ほとんどの暗号化アルゴリズム (これを含む) は固定ブロック サイズ (通常は 8 バイト) で動作します。したがって、この場合に実際にエンコードされる値は次のとおりです 123\0\0\0\0\0(これは実際には少し変わっています。多くの暗号化アルゴリズムはパディング サイズをパディングとして使用します - 例123\5\5\5\5\5)

于 2013-08-20T10:12:46.720 に答える
1

モードをECBからCBCのようなより安全なモードに変更することを検討してください。パディングを削除するには、rtrim($decryptedtext, "\0") を使用できます。を見てください。これはデフォルトの 0 パディングです。前述のように、暗号化データはブロックのサイズに合わせて 0 でパディングされます。暗号化する前に PKCS7 パディングを追加できます。ここで例を見つけることができます。

于 2013-08-20T10:51:09.663 に答える