【问题标题】:PHP switch from MCRYPT_MODE_ECB to AES-256-ECBPHP 从 MCRYPT_MODE_ECB 切换到 AES-256-ECB
【发布时间】:2018-07-22 10:00:26
【问题描述】:

我正在重写代码以兼容 PHP 7.2。旧代码是

public function encryptPasswordOld($password, $salt)
{
    $key = md5($salt);
    $result = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $password, MCRYPT_MODE_ECB);
    return base64_encode($result);
}

根据我的研究,新代码应该是这样的

public function encryptPasswordNew($password, $salt)
{
    $method = 'AES-256-ECB';
    $ivSize = openssl_cipher_iv_length($method);
    $iv = openssl_random_pseudo_bytes($ivSize);
    $key = md5($salt);
    $result = openssl_encrypt($password, $method, $key, OPENSSL_RAW_DATA, $iv);
    return base64_encode($result);
}

但我尝试了 openssl_encrypt 选项的所有组合:OPENSSL_RAW_DATAOPENSSL_RAW_DATA | OPENSSL_ZERO_PADDINGOPENSSL_ZERO_PADDING0,但由于旧方法返回,结果仍然不同

【问题讨论】:

标签: php openssl mcrypt


【解决方案1】:

尝试在加密前对值使用 pkcs5padding。即

记住块大小应该基于 8 字节,即 8/16/24 等。

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

和加密选项应该是 OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,即

openssl_encrypt(pkcs5_pad($value, 16), 'aes-256-ecb', $aes_key, 3, '')

【讨论】:

  • ecb 不推荐使用,它将文本分成段并在没有任何上下文信息的情况下对每个段进行加密,与 cbc 模式相比,解密“相当容易”。
猜你喜欢
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多