openssl解密的异常处理在php中

时间:2018-05-05 08:26:03

标签: php exception encryption error-handling

我需要帮助php中的解密算法。

我在解密函数中传递错误的加密数据时出错。所以我需要使用异常处理错误。有可能吗?

我尝试了这段代码,但没有运气

function decrypt($encrypt_data) {
    $key = ENC_KEY;
    $encryption_key = base64_decode($key);
    list($encrypted_data, $iv) = explode('::', base64_decode($encrypt_data), 2);

    try {
      if(openssl_decrypt($encrypted_data, 'aes-256-cbc', $encryption_key, 0, $iv)) {
          throw new customException($encrypted_data);
      }
    }

    catch (customException $e) {
      echo $e->errorMessage();
    }

 }

但是这个函数给了我错误: -

  

警告:openssl_decrypt():传递的IV只有7个字节长,密码   期望一个精确的16字节的IV,在abc.php

中用\ 0填充

1 个答案:

答案 0 :(得分:1)

As Magnus indicates,密钥和IV应该是CBC模式下AES的特定大小。对于AES-256,密钥大小应为32字节,IV与块大小相同:16字节。

通常任何语言都会在使用它之前验证密钥和IV的大小,但是PHP有一个讨厌的习惯(对于OpenSSL和mcrypt API都是如此),如果它是零填充它的话。当它太大时太小或切割它的一部分。这可能是因为底层C库没有验证大小,因为键和IV作为指针而不是数组或对象传递。

要解决这个问题,你应该确保密钥正好是32个随机字节(显然是因为没有警告),并且IV由16个随机字节组成。

请注意,对于CBC模式,它是安全要求,IV由16个字节组成,对于对手来说是完全不可预测的。因此,不建议仅通过用零填充IV来修复错误。虽然使用7字节作为IV不太可能直接导致漏洞利用,但您应该修复协议而不是依赖于代码中的变通办法。

如上所述,其他加密API(针对不同语言)将严格执行使用正确大小的密钥和IV;如果你继续使用7字节的IV,那么所有这些运行时也可能需要解决方法。