本文主要是介绍PHP字符串加密解密函数(带时效限制),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
大牛们总是能深入的了解到一些东西,比如下面这篇文章,从DZ中挖掘出一个好用的函数。围观之…
最近, 从discuz里面发现了一个很牛的加密解密函数。
此函数的厉害之处在于可以在指定时间内加密还原字符串,超时无法还原这样我们就可以拿此函数来做很多用途了,比如:单点登录的token加密传输啦,临时密码啦等等
01 | <?php |
02 | /** |
03 | * @param string $string 原文或者密文 |
04 | * @param string $operation 操作(ENCODE | DECODE), 默认为 DECODE |
05 | * @param string $key 密钥 |
06 | * @param int $expiry 密文有效期, 加密时候有效, 单位 秒,0 为永久有效 |
07 | * @return string 处理后的 原文或者 经过 base64_encode 处理后的密文 |
08 | * |
09 | * @example |
10 | * |
11 | * $a = authcode('abc', 'ENCODE', 'key'); |
12 | * $b = authcode($a, 'DECODE', 'key'); // $b(abc) |
13 | * |
14 | * $a = authcode('abc', 'ENCODE', 'key', 3600); |
15 | * $b = authcode('abc', 'DECODE', 'key'); // 在一个小时内,$b(abc),否则 $b 为空 |
16 | */ |
17 | |
18 | function authcode( $string , $operation = 'DECODE' , $key = '' , $expiry = 3600) { |
19 | $ckey_length = 4; |
20 | // 随机密钥长度 取值 0-32; |
21 | // 加入随机密钥,可以令密文无任何规律,即便是原文和密钥完全相同,加密结果也会每次不同,增大破解难度。 |
22 | // 取值越大,密文变动规律越大,密文变化 = 16 的 $ckey_length 次方 |
23 | // 当此值为 0 时,则不产生随机密钥 |
24 | |
25 | $key = md5( $key ? $key : EABAX::getAppInf( 'KEY' )); |
26 | $keya = md5( substr ( $key , 0, 16)); |
27 | $keyb = md5( substr ( $key , 16, 16)); |
28 | $keyc = $ckey_length ? ( $operation == 'DECODE' ? substr ( $string , 0, $ckey_length ): substr (md5(microtime()), - $ckey_length )) : '' ; |
29 | |
30 | $cryptkey = $keya .md5( $keya . $keyc ); |
31 | $key_length = strlen ( $cryptkey ); |
32 | |
33 | $string = $operation == 'DECODE' ? base64_decode ( substr ( $string , $ckey_length )) : sprintf( '%010d' , $expiry ? $expiry + time() : 0). substr (md5( $string . $keyb ), 0, 16). $string ; |
34 | $string_length = strlen ( $string ); |
35 | |
36 | $result = '' ; |
37 | $box = range(0, 255); |
38 | |
39 | $rndkey = array (); |
40 | for ( $i = 0; $i <= 255; $i ++) { |
41 | $rndkey [ $i ] = ord( $cryptkey [ $i % $key_length ]); |
42 | } |
43 | |
44 | for ( $j = $i = 0; $i < 256; $i ++) { |
45 | $j = ( $j + $box [ $i ] + $rndkey [ $i ]) % 256; |
46 | $tmp = $box [ $i ]; |
47 | $box [ $i ] = $box [ $j ]; |
48 | $box [ $j ] = $tmp ; |
49 | } |
50 | |
51 | for ( $a = $j = $i = 0; $i < $string_length ; $i ++) { |
52 | $a = ( $a + 1) % 256; |
53 | $j = ( $j + $box [ $a ]) % 256; |
54 | $tmp = $box [ $a ]; |
55 | $box [ $a ] = $box [ $j ]; |
56 | $box [ $j ] = $tmp ; |
57 | $result .= chr (ord( $string [ $i ]) ^ ( $box [( $box [ $a ] + $box [ $j ]) % 256])); |
58 | } |
59 | |
60 | if ( $operation == 'DECODE' ) { |
61 | if (( substr ( $result , 0, 10) == 0 || substr ( $result , 0, 10) - time() > 0) && substr ( $result , 10, 16) == substr (md5( substr ( $result , 26). $keyb ), 0, 16)) { |
62 | return substr ( $result , 26); |
63 | } else { |
64 | return '' ; |
65 | } |
66 | } else { |
67 | return $keyc . str_replace ( '=' , '' , base64_encode ( $result )); |
68 | } |
69 | |
70 | } |
这篇关于PHP字符串加密解密函数(带时效限制)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!