簡體   English   中英

mcrypt_encrypt在PHP 5.6.9上無法正常工作

[英]mcrypt_encrypt not working properly on PHP 5.6.9

我有以下代碼在PHP 5.5.9上運行良好。

function index()
{
    echo $this->encryptText_3des('TEST','JHHKJH9879');
}

function encryptText_3des($plainText, $key) {
    $key = hash("md5", $key, TRUE); 
    for ($x=0;$x<8;$x++) {
        $key = $key.substr($key, $x, 1);
    }
    $padded = $this->pkcs5_pad($plainText,
    mcrypt_get_block_size(MCRYPT_3DES, MCRYPT_MODE_CBC));
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC));
    return $encrypted;
}

function pkcs5_pad ($text, $blocksize)  
{
    $pad = $blocksize - (strlen($text) % $blocksize);
    return $text . str_repeat(chr($pad), $pad);
}

加密發生得很好。但是在5.6.9中,在mcrypt_encrypt的PHP文檔中,他們提到了

不再接受無效的密鑰和iv尺寸。 mcrypt_encrypt()現在將拋出警告,如果輸入無效,則返回FALSE。 以前,鍵和IV用'\\ 0'字節填充到下一個有效大小。

如何在不改變加密算法的情況下使用第五個參數修改當前代碼?

我試過了

$iv_size = mcrypt_get_iv_size(MCRYPT_3DES, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);

給$ iv作為第五個參數。

但它沒有成功。 加密與早期加密不同。

不要模擬舊的PHP版本弱行為來初始化IV。

使用mcrypt_create_iv()

他們刪除了自動零字節iv是有原因的

找到答案,以防任何人需要

$ivSize = 8; 
$iv = str_repeat("\0", $ivSize);

$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_3DES, $key, $padded, MCRYPT_MODE_CBC, $iv));

手動傳遞第5個參數,這是早期版本自己做的!

我會建議你不要重新發明輪子,因為你的功能有許多加密工程缺陷。

  • 不要使用3DES,請使用AES。 無論您需要的密鑰大小如何,AES的正確mcrypt常量都是MCRYPT_RIJNDAEL_128 麥克瑞特非常可怕
  • 不要使用md5()作為密鑰派生函數。 如果您發現自己需要KDF(例如,因為您使用的是密碼而不是存儲加密密鑰),請使用帶有SHA-256的hash_pbkdf2()
  • 您正在加密但不驗證您的密文。 沒有消息身份驗證的密鑰加密在任何語言中都不安全 加密然后MAC請。

如果您要使用mcrypt(我們在PHP中使用安全數據加密的建議是使用libsodium,如果可以;否則化解/ php-encryption ;否則打開),請確保將正確的常量傳遞給mcrypt_create_iv()

$iv = mcrypt_create_iv(16, MCRYPT_RAND); // BAD EXAMPLE

好的

$iv = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); // YES!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM