加密数字 URL 参数,结果不应长于原始值
我必须加密特定的 URL 参数。如果我希望输出少于 6-7 个字符,我应该使用什么算法?
输入仅为 1 到 1,000,000 之间的整数。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我必须加密特定的 URL 参数。如果我希望输出少于 6-7 个字符,我应该使用什么算法?
输入仅为 1 到 1,000,000 之间的整数。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
如果您需要加密并需要尽可能短的结果,则必须使用流密码。 Blowfish(您之前使用的)是一种块密码,结果始终具有单个块的最小大小。
在维基百科上查找流密码的比较以及PHP 手册mcrypt
另外,加密的结果可能包含特殊字符,因此将其作为参数放入 URL 时,应该使用
urlencode()
或base64_encode()
使用
urlencode()
或base64_encode()
将扩展字符串,使其比原始数据更长。这是确保传输/URL 安全所必需的。但是,由于您的输入始终是数字,因此您可以使用
base_convert()
来缩短输入。在解码方面,您必须做相反的事情。要获得更短的结果,您可以使用
enminicode()
/ Aron Cederholm 提供的deminicode()
函数,而不是使用base_convert()
。下面是一个使用 RC4 流密码(顺便说一句,它不是很强)以及从基数 10 到基数 36 的转换的示例。
注意:此示例仅适用于数字,因此它使用
base_convert()
缩小输入字符串!结果:
If you require encryption and need to have the shortest result possible, you must use a stream cipher. Blowfish (what you previously used) is a blockcipher and the result will always have the minimum size of one single block.
Find a comparison of stream ciphers on Wikipedia and the list of supported ciphers in the PHP manual on mcrypt
Also, the result of the encryption may contain special chars, so when putting it into an URL as a parameter, you should use
urlencode()
orbase64_encode()
Using
urlencode()
orbase64_encode()
will expand your string, making it longer than the original data. This is necessary to make it transport/URL safe.However, since your input is always a number you can use
base_convert()
to shorten your input. On the decoding side, you'd have to do reverse the same thing.To get even shorter results, you could make use of the
enminicode()
/deminicode()
function provided by Aron Cederholm instead of usingbase_convert()
.Here is an example using the RC4 stream cipher (which is not very strong, by the way) and conversion from base 10 to base 36.
NOTE: this example only works on numbers hence its using
base_convert()
to shrink the input string!Result:
其输出:
像魅力一样工作。对于 1000000 以内的整数,它将消耗 4 个字母。但为了安全起见,请勿使用此功能!隐匿安全永远不是一种选择,如果用户不知道的话,您永远不会尝试使用这种方法来向用户隐藏号码。
另一个更优雅的解决方案是使用 base_convert,它会产生稍长的字符串,但仍适合 6-7 个字符。
输出:
Which outputs:
Works like a charm. For integers up to 1000000 it will consume 4 letters. But do not use this for security! Security by obscurity is never an option, and you never try this method to hide a number from the user if they are not meant to know about it.
Another more elegant solution is to use base_convert, which will yield slightly longer strings, but it will still fit within 6-7 characters.
output:
将其转换为十六进制很简单。
您甚至想玩得开心并将其转换为基数 36
并执行相反的操作来解码:
It's simple convert it to hexadecimal.
You want even have fun and convert it to a base 36
And do the reverse operation to decode :