1

我正在尝试将加密的 cookie 存储在 PHP 应用程序中,并实现了 2 个不同的加密库以使其正常工作。

两种实现在部署到服务器时都会在调用我的加密函数时产生致命异常。但是,在我的本地开发环境中,两种加密实现都可以成功运行。

我的 open_ssl 实现代码(适用于本地主机,不适用于远程服务器):

set_encrypted_cookie("foo","my_cookie_name");

function set_encrypted_cookie($msg,$name){
    $key = '0123456qwerty'; // Key is stored externally but defined locally for debugging

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

    $encryptedStr = openssl_encrypt($msg, 'aes-256-cbc', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv);

    setcookie($name,$encryptedStr,0,'/');
}

关于为什么服务器可能不允许 openssl_encrypt() 函数执行的任何想法?

4

1 回答 1

3

openssl_encrypt()返回原始二进制文件,您应该base64_encode()在存储到 cookie 之前。

在你这样做之前,你可以做几件事来改进你的加密协议:

  1. 使用MCRYPT_DEV_URANDOM,不使用MCRYPT_RAND
  2. 将您的 IV 与您的密文一起存储(在base64_encode()ing 之前),以便您在解密时可以使用相同的 IV。
  3. 然后加密 MAC

最后一个链接有两个函数setLessUnsafeCookie()getLessUnsafeCookie(),您可以将它们用作 PHP 5.6.x 的插件。

为了确保使用安全,还有两件事要做:

  1. 使用 HKDF 将密钥拆分为加密密钥和解密密钥。
  2. 在明文上使用 PKCS7 填充。

(如果你想获得最大的安全性,你可以使用 libsodium而不是 openssl。)另外,不要使用 mcrypt

于 2015-09-16T19:59:02.687 回答