[英]mcrypt seem to be not 100% reversible
我的數據庫中有336個“客戶”
我嘗試使用此代碼encrypt
然后decrypt
一些數據
本質是:正確:323-錯誤:13
是什么原因導致mcrypt
不完全可逆?
編輯:請不要嘗試更改問題的性質,詢問我的問題,否則我將投票否決您的答案。 這個算法的問題似乎不是100%可逆的,這就是問題,不是我要使用它的問題
$wrong = $right = 0;
foreach ($clients as $c) {
$string_to_encode = trim($c->first_field . ":::" . $c->last_field);
$mc_key = Yii::app()->params["rijndael_key"];
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv_1 = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$crypt = trim(mcrypt_encrypt(
MCRYPT_RIJNDAEL_256,
$mc_key,
$string_to_encode,
MCRYPT_MODE_ECB,
$iv_1));
$token = urlencode(base64_encode($crypt));
$string_to_decode = base64_decode(urldecode($token));
$string_decoded = trim(mcrypt_decrypt(
MCRYPT_RIJNDAEL_256,
$mc_key,
$string_to_decode,
MCRYPT_MODE_ECB,
$iv_1));
if ($string_to_encode != $string_decoded) {
echo $string_to_encode . PHP_EOL;
echo "***** ERROR ! ***** " . PHP_EOL;
echo $string_to_encode . PHP_EOL;
echo $string_decoded . PHP_EOL;
$wrong ++;
} else {
$right ++;
}
}
echo "Right $right - Wrong $wrong" . PHP_EOL;
與純字符串和解碼后的字符串有一些差異[請注意,我更改了登錄名....]
customer.email@alice.it:::11734
customer.email@alice.it:::11z͉\wo����y�+� �>�d��x�
該算法不是100%可逆的。 這是問題,這是問題...很明顯,我不會在生產中使用它...這只是向您演示該算法有問題的一種情況
其他人提到了它,但是您正在修剪加密結果。 密文將隨機出現,並且您正在加密的某些項目將在末尾產生空格。
如果修剪密文,則會丟失信息,並且字符串將無法正確解碼。
不用加密密碼,而是對它們進行哈希處理 。
已經解決了,您不應使用雙向加密算法來保存密碼,而應使用單向哈希算法。
您正在修整數據密文。 刪除mcrypt_encrypt()
trim()
周圍的mcrypt_encrypt()
即可。
也就是說,您還有另一個問題。 您生成了IV,但是ECB模式不使用IV,因此它們是無用的。 保持密文更加不可預測的更安全方法是切換到CBC模式。 執行此操作時,請記住,加密和解密時IV應當相同(即$iv_1
和$iv_2
應該相同)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.