PHP 中的双向加密
我的应用程序(显然)使用唯一 ID 来区分记录。此 UID 在 URL(例如 )中传递。./examplepage.php?UID=$example_int
虽然我显然有服务器端验证来确保客户端不会访问其他客户端的数据,但是否有一种双向加密方法,我可以在PHP中仅使用加密的UID(例如),以进一步减少任何人的想法“嘿,如果我增加这个整数会发生什么?./examplepage.php?EUID=$encrypted_int
腾讯网.
我的应用程序(显然)使用唯一 ID 来区分记录。此 UID 在 URL(例如 )中传递。./examplepage.php?UID=$example_int
虽然我显然有服务器端验证来确保客户端不会访问其他客户端的数据,但是否有一种双向加密方法,我可以在PHP中仅使用加密的UID(例如),以进一步减少任何人的想法“嘿,如果我增加这个整数会发生什么?./examplepage.php?EUID=$encrypted_int
腾讯网.
PHP 5.3 引入了一种非常易于使用的新加密方法:和 .这里没有很好的记录,所以这里有一个简单的例子:openssl_encrypt
openssl_decrypt
$textToEncrypt = "My super secret information.";
$encryptionMethod = "AES-256-CBC"; // AES is used by the U.S. gov't to encrypt top secret documents.
$secretHash = "25c6c7ff35b9979b151f2136cd13b0ff";
//To encrypt
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash);
//To Decrypt
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $secretHash);
//Result
echo "Encrypted: $encryptedMessage <br>Decrypted: $decryptedMessage";
我选择了256-AES,因为它坚固而快速。它已被美国政府用于加密绝密文件。它快速考虑机器和软件。以下是可用加密方法的列表:
AES-128-CBC, AES-128-CFB, AES-128-CFB1, AES-128-CFB8, AES-128-ECB, AES-128-OFB, AES-192-CBC, AES-192-CFB, AES-192-CFB1, AES-192-CFB8, AES-192-ECB, AES-192-OFB, AES-256-CBC, AES-256-CFB, AES-256-CFB1, AES-256-CFB8, AES-256-ECB, AES-256-OFB, BF-CBC, BF-CFB, BF-ECB, BF-OFB, CAMELLIA-128-CBC, CAMELLIA-128-CFB, CAMELLIA-128-CFB1, CAMELLIA-128-CFB8, CAMELLIA-128-ECB, CAMELLIA-128-OFB, CAMELLIA-192-CBC, CAMELLIA-192-CFB, CAMELLIA-192-CFB1, CAMELLIA-192-CFB8, CAMELLIA-192-ECB,山茶花-192-OFB, 山茶花-256-CBC, 山茶花-256-CFB, 山茶花-256-CFB1, 山茶花-256-CFB8, CAMELLIA-256-ECB, CAMELLIA-256-OFB, CAST5-CBC, CAST5-CFB, CAST5-ECB, CAST5-OFB, DES-CBC, DES-CFB, DES-CFB1, DES-CFB8, DES-ECB, DES-EDE-CBC, DES-EDE-CFB, DES-EDE-CFB, DES-EDE-OFB, DES-EDE3-CBC, DES-EDE3-CFB, DES-EDE3-CFB1, DES-EDE3-CFB8, DES-EDE3-OFB, DES-OFB, DES-OFB, DESX-CBC, RC2-40-CBC, RC2-64-CBC, RC2-CBC, RC2-CBC, RC2-CFB, SEED-CB, SEED-CB, SEED-ECB, SEED-CB, SEED-ECB, SEED-CBaes-128-cbc, aes-128-cfb, aes-128-cfb1, aes-128-cfb8, aes-128-ecb, aes-128-ofb, aes-192-cbc, aes-192-cfb, aes-192-cfb1, aes-192-cfb8, aes-192-ecb, aes-192-ofb, aes-256-cbc, aes-256-cfb, aes-256-cfb1, aes-256-cfb8, aes-256-ecb, aes-256-ofb, bf-cbc, bf-cfb, bf-ecb, bf-ofb, camellia-128-cbc, camellia-128-cfb, camellia-128-cfb1, camellia-128-cfb8, camellia-128-ecb, camellia-128-ofb, camellia-192-cbc, camellia-192-cfb, camellia-192-cfb1, camellia-192-cfb8, camellia-192-ecb,山茶花-192-ofb,山茶花-256-cbc,山茶花-256-cfb,山茶花-256-cfb1,山茶花-256-cfb8, 山茶花-256-ecb, 山茶花-256-ofb, cast5-cbc, cast5-cfb, cast5-ecb, cast5-ofb, des-cbc, des-cfb, des-cfb1, des-cfb8, des-ecb, des-ede-cbc, des-ede-cfb, des-ede-cfb, des-ede3, des-ede3-cbc, des-ede3-cfb, des-ede3-cfb1, des-ede3-cfb8, des-ede3-ofb, des-ofb, des-ofb, desx-cbc, rc2-40-cbc, rc2-64-cbc, rc2-cbc, rc2-cbc, rc2-cfb, rc2-cfb, seed-40
重要更新!!!
感谢 Hobo 和 Jorwin 指出,在 PHP 5.3.3 >中有一个新参数使此函数更加安全。
Jorwin在他的评论中引用了这个链接,这里有一个适用的摘录:
在5.3.3中,他们添加了一个新参数,(初始化向量)实参数是:
string $iv
string openssl_encrypt ( string $data , string $method , string $password, bool $raw_output = false, string $iv )
如果缺少,则会发出警告:“使用空的初始化向量 (iv) 可能不安全,不建议使用”。
$iv
如果太短,则另一个警告:“IV 传递的长度仅为 3 个字节,密码要求 IV 恰好为 8 个字节,填充为 \0”
$iv
相同的IV应该用于
openssl_decrypt()
您不需要双向加密 - 加密是为了保持机密性,但您真正想要的是真实性。
HMAC(本质上是键控哈希)是获得加密真实性的一种方法。使用只有服务器知道的密钥,在 UID 中伴随 UID 的 HMAC(PHP 具有 HMAC 实现)。在每个请求开始时,检查 HMAC。
基本上,使用正确的工具来完成正确的工作。