Клиент недавно спросил о настройке небольших базовых уровней шифрования для строк для сохранения в базе данных, поэтому я посмотрел небольшой учебник с использованием openssl_encrypt/openssl_decrypt
и построил это:
<?php
$str = 'Morbi ac risus et risus consectetur rhoncus. Curabitur et libero ut tellus congue faucibus. Curabitur varius odio sed euismod congue. Pellentesque id lacinia erat, ut fringilla leo. Praesent in orci sagittis lorem ultrices fringilla ac vitae ipsum. Nam viverra ut leo vel ullamcorper. Phasellus lobortis quis orci et sagittis. Mauris fringilla eleifend nunc, a lobortis metus ornare quis. Proin a lacinia sem. Vivamus pulvinar cursus ipsum at vehicula.';
$pw = 'opensesame';
$salt = sha1(mt_rand());
$iv = substr(sha1(mt_rand()), 0, 16);
echo "\n Password: $pw \n Message: $str \n Salt: $salt \n IV: $iv\n";
$encrypted = openssl_encrypt($str, 'AES-128-CBC', "$salt:$pw", null, $iv);
$bundle = "$salt:$iv:$encrypted";
echo " Encrypted bundle = $bundle \n\n";
unset($str, $pw, $salt, $iv, $encrypted);
list($salt, $iv, $encrypted) = explode(':', $bundle);
$pw = 'opensesame';
echo "\n Password: $pw \n Message: $encrypted \n Salt: $salt \n IV: $iv\n";
$str = openssl_decrypt($encrypted, 'AES-128-CBC', "$salt:$pw", null, $iv);
if ($str === false) {
echo " Invalid password \n\n";
} else{
echo " Message: $str \n\n ";
}
list($salt, $iv, $encrypted) = explode(':', $bundle);
$pw = 'bork';
echo "\n Password: $pw \n Message: $encrypted \n Salt: $salt \n IV: $iv\n";
$str = openssl_decrypt($encrypted, 'AES-128-CBC', "$salt:$pw", null, $iv);
if ($str === false) {
echo " Invalid password \n\n";
} else{
echo " Message: $str \n\n ";
}
Изначально я был доволенчто он успешно зашифровал строку, а затем расшифровал ее точно.Ради тщательности я решил добавить вариант использования, в котором вместо этого был указан неверный пароль, и к моему большому разочарованию неверный пароль также работал.Немного повозившись позже, я заметил, что если бы ключ шифрования был $pw:$salt
вместо $salt:$pw
, неправильные пароли не сработали бы должным образом.
Но почему это так?Я просмотрел документацию для обеих функций и не заметил ничего конкретного, что могло бы вызвать это.Это проблема с моим кодом и как я создаю соль и iv?