PHP Openssl加密URL的数据

时间:2016-01-19 02:02:49

标签: php encryption

我有这段代码:

<?php

$key = 'thisisakey';
$iv = '1234567812345678';

$plaintext = 'Hello World';

$ciphertext = openssl_encrypt($plaintext,  'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
echo $ciphertext . '<br>';

$plaintext  = openssl_decrypt($ciphertext, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv); 
echo $plaintext . '<br>';

?>

此代码背后的想法是加密要在URL上使用的数据。所以,我期待输出哪个URL友好。我的意思是,它只包含字母数字字符。但是当我使用这个openssl_encrypt函数时,我会得到奇怪的字符,我不认为它是URL友好的。

它产生如下输出:

^‘-7Ⱦ®l¿ô¾áÙ

如何从openssl_encrypt生成URL友好字符?谢谢

1 个答案:

答案 0 :(得分:7)

这个问题被问了很多,用不同的单词选择(这使得很难说“只搜索它!”)。这个事实促使了一篇名为The Comprehensive Guide to URL Parameter Encryption in PHP 的博客文章。

人们在这里想要做什么

Some encryption function is used to deterministically retrieve the ID

人们应该怎么做

Use a separate column

说明

通常,人们希望使用 short 随机查找的URL。这并没有太多空间来encrypt then authenticate您要混淆的数据库记录ID。这样做将要求URL的最小长度为32个字节(对于HMAC-SHA256),以base64编码时为44个字符。

一种更简单的策略是生成一个随机字符串(请参见random_compat(有关random_bytes()的PHP5实现和random_int()的生成这些字符串的PHP5)并引用该列。

如果加密不可协商该怎么办?

如果必须加密数据(非常不推荐),请不要使用自主设计(尤其是unauthenticated CBC mode)。使用trustworthy library instead

加密工作后,请确保密文使用hex or base64url encoding