PHP中的双向加密

ben*_*njy 29 php encryption

我的应用程序(显然)使用唯一的ID来区分记录.此UID在URL(例如./examplepage.php?UID=$example_int)等中传递.

虽然我明显有服务器端验证以确保客户端不访问其他客户端的数据,但是我可以在PHP中使用双向加密方法来仅传递加密的UID(例如./examplepage.php?EUID=$encrypted_int),以进一步减少机会有人在想"嘿,如果我增加这个整数怎么办?"

TIA.

esp*_*ley 97

PHP 5.3引入了一种非常易于使用的新加密方法:openssl_encryptopenssl_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";
Run Code Online (Sandbox Code Playgroud)

我之所以选择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,CAMELLIA-192-OFB,CAMELLIA-256- CBC,CAMELLIA-256-CFB,CAMELLIA-256-CFB1,CAMELLIA-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,DES-EDE-CBC,DES-EDE-CFB,DES-EDE-OFB,DES-EDE3,DES-EDE3-CBC, DES-EDE3-CFB,DES-EDE3-CFB1,DES-EDE3-CFB8,DES-EDE3-OFB,DES-OFB,DESX-CBC,RC2-40-CBC,RC2-64-CBC,RC2-CBC,RC2- CFB,RC2-ECB,RC2-OFB,RC4,RC4-40,SEED-CBC,SEED-CFB,SEED-ECB,SEED-OFB,aes-128-cbc,aes-128-cfb,aes-128-cfb1, AES-1 28-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,山茶花-128-cbc,山茶花-128-cfb,山茶花-128-cfb1,山茶花-128-cfb8,山茶花-128-ecb,山茶花-128-ofb,山茶花-192-cbc,山茶花-192- cfb,camellia-192-cfb1,camellia-192-cfb8,camellia-192-ecb,camellia-192-ofb,camellia-256-cbc,camellia-256-cfb,camellia-256-cfb1,camellia-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,des-ede-cbc,des-ede-cfb,des-ede-ofb,des-ede3,des-ede3-cbc,des-ede3-cfb,des-ede3-cfb1,des-ede3-cfb8,des- ede3-ofb,des-ofb,desx-cbc,rc2-40-cbc,rc2-64-cbc,rc2-cbc,rc2-cfb,rc2-ecb,rc2-ofb,rc4,rc4-40,seed-cbc,种子cfb,种子-ecb,种子-b


重要更新!!!

感谢Hobo和Jorwin在PHP 5.3.3中指出,有一个新参数可以使这个函数更安全一些.

Jorwin在他的评论中引用了这个链接,这是一个适用的摘录:

在5.3.3中他们添加了一个新参数,string $iv(初始化向量)Real参数是:string openssl_encrypt ( string $data , string $method , string $password, bool $raw_output = false, string $iv )

如果$iv缺少,则发出警告:"使用空的初始化向量(iv)可能不安全,不推荐".

如果$iv太短,另一个警告:"IV传递只有3个字节长,密码期望一个精确的8字节的IV,填充\ 0"

同样的IV应该用于 openssl_decrypt()

  • @Hobo - 你是对的,我遇到了同样的问题.这是一个更详细的解释.谢谢espradley的回答.http://php.net/manual/en/function.openssl-encrypt.php#104438 (2认同)

caf*_*caf 30

你不需要双向加密 - 加密是为了保密,但你真正想要的是真实性.

HMAC(基本上是键控哈希)是获取加密真实性的一种方式.将UID与UID的HMAC(PHP具有HMAC实现)一起使用,只使用服务器知道的密钥.在每个请求开始时,检查HMAC.

基本上,使用正确的工具来完成正确的工作.


scr*_*gar -5

我认为,在 ID 旁边放置一个哈希值以确保其安全性,或者用额外的数据填充 ID,甚至将 ID 转换为十六进制,这些都可以很好地工作。

  • @benjy 任何主动增加 UID 的人都会立即识别出十六进制或填充的整数。你真的应该按照@caf的建议去做。或者只是生成非递增、不可预测的 UID。 (6认同)