PHP 加密在服务器上不起作用

PHP encryption not working on server

我正在尝试将加密的 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() 函数执行的任何想法?

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

在你这样做之前,你可以做一些事情来改进你的密码协议:

  1. 使用 MCRYPT_DEV_URANDOM,而不是 MCRYPT_RAND
  2. 将您的 IV 与您的密文一起存储(在 base64_encode() 对其进行加密之前),因此您可以在解密时使用相同的 IV。
  3. Encrypt then MAC.

最后一个 link 有两个功能,setLessUnsafeCookie()getLessUnsafeCookie(),您可以将它们用作 PHP 5.6.x .

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

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

(如果你想获得最大的安全性,你可以use libsodium instead of openssl.) Also, don't use mcrypt