【发布时间】:2018-03-31 22:21:28
【问题描述】:
我目前有一个 PHP 应用程序,它使用静态数据加密将敏感信息存储到数据库中,我以后可以解密以在我的应用程序中使用。
这是我正在使用的当前代码。我知道...我知道...它根本不是很安全,但它适用于我使用它的目的。我不存储信用卡号、社会保险号或类似的东西。主要是姓名和地址。
define('CRYPTO_KEY', 'some-key');
function decrypt($val){
$val = urlencode($val);
$data = base64_decode(urldecode($val));
$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));
$val = rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
hash('sha256', CRYPTO_KEY, true),
substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
MCRYPT_MODE_CBC,
$iv
),
"\0"
);
return $val;
}
function enc($val){
$iv = mcrypt_create_iv(
mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
MCRYPT_DEV_URANDOM
);
$val = urlencode(base64_encode(
$iv .
mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
hash('sha256', CRYPTO_KEY, true),
$selection,
MCRYPT_MODE_CBC,
$iv
)
));
return $val;
}
我遇到的问题是我刚刚从 PHP 5.5 升级到 PHP 7.1。现在在 PHP 7.1 中,我的 encrypt/decrypt 函数会抛出大量警告,指出以下函数已被弃用:
- mcrypt_get_iv_size()
- mcrypt_create_iv()
- mcrypt_encrypt()
- mcrypt_decrypt()
我正在做一些研究,发现新的建议是使用 libsodium 或 OpenSSL 等库,发现 HERE
我查看了这两个文档,但文档技术性太强,我无法理解。我什至不知道如何安装 libsodium,更不用说使用它了。
我的问题是,是否有人愿意分享与 PHP 7.1 或更高版本兼容的不错的加密/解密功能?
更好的是,有人愿意提供有关如何使用 libsodium 或 OpenSSL 进行数据加密/解密的说明吗?
仅供参考 - 我目前正在使用带有 cPanle 的共享托管平台。我已经安装了作曲家并了解如何通过它安装软件包。我从未使用过 PECL 或 PEAR
【问题讨论】:
-
注意:php.net/manual/en/function.mcrypt-encrypt.php 和 php.net/manual/en/function.mcrypt-decrypt.php 声明 警告 自 PHP 7.1.0 起,此函数已被弃用。强烈建议不要依赖此函数。
-
@fred 我知道这就是我向社区寻求更好方法的原因
-
您这样做实际上是为了防止什么?如果您像这样将加密/解密密钥直接存储在 PHP 源代码中,任何有权访问您的代码的人都可以轻松解密他们想要的任何内容。
-
另见Use openssl_encrypt to replace Mcrypt for 3DES-ECB encryption、Can't decrypt using pgcrypto from AES-256-CBC but AES-128-CBC is OK、MCrypt rijndael-128 to OpenSSL aes-128-ecb conversion等。另见Upgrading my encryption library from Mcrypt to OpenSSL、Replace Mcrypt with OpenSSL和Preparing for removal of Mcrypt in PHP
标签: php encryption openssl cryptography libsodium