PHP字符串加密解密函数(带时效限制)
来源:互联网 发布:广西java招聘 编辑:程序博客网 时间:2024/04/27 22:36
大牛们总是能深入的了解到一些东西,比如下面这篇文章,从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字符串加密解密函数(带时效限制)
- php自带加密解密函数
- php 自带加密、解密函数
- php自带加密解密函数
- php 自带加密、解密函数
- PHP的加密解密字符串函数
- PHP的加密解密字符串函数
- php字符串加密解密
- PHP加密解密字符串
- 字符串加密解密函数
- 字符串加密解密函数
- PHP 加密解密函数
- PHP加密解密函数
- PHP加密解密函数
- PHP加密解密函数
- php对字符串加密解密常用的几个内置函数
- Delphi字符串加密解密函数
- Delphi字符串加密解密函数
- 备忘笔记:转载_JAVA标准输入读取整型
- Intel's Processing RMS (Recognition, Mining and Synthesis)
- thinking about this
- PHP大小写是否敏感问题的汇总
- hibernate之优化抓取(定义全局抓取计划--延迟抓取的实例1)
- PHP字符串加密解密函数(带时效限制)
- hibernate之优化抓取(定义全局抓取计划--延迟抓取的实例2)
- Sieve of Eratosthenes Algorithm算法 JAVA实现
- header(Location)标准的使用方法
- WINCE6.0+S3C2443自动重启的实现
- WINCE下如何虚拟多个串口
- WINCE下实现USB转RS232
- WINCE下实现基于USB的camera
- 播放视频一会,出错并自动关闭