authcode()并不是PHP的内置函数,它是康盛开发的一个使用异或运算进行加密和解密的函数,可以说这是康盛对中国的PHP界作出的重大贡献。康盛自己的产品如Discuz,UCenter等以及许多使用PHP的中国公司都用这个函数进行加密。在前面的ThinkPHP3.1.2整合UCenter详解(四)的同步登录中authcode()就扮演者重要的角色。在同步登录(从项目登录到UCenter)的过程中,authcode()把用户的登录信息进行加密,因为没有加密的数据在传递过程中容易被截取,这样会暴露了用户的信息,authcode()的作用就是给传递的数据提供加密保护作用。在数据到达终端(UCenter)时authcode()再把加密的数据进行反向解密,还原数据。通过下面的程序演示会让我们更了解authcode()以及同步登录的原理。
02 | define( 'UC_KEY' , 'abc123456' ); |
03 | function authcode( $string , $operation = 'DECODE' , $key = '' , $expiry = 0) { |
06 | $key = md5( $key ? $key : UC_KEY); |
07 | $keya = md5( substr ( $key , 0, 16)); |
08 | $keyb = md5( substr ( $key , 16, 16)); |
09 | $keyc = $ckey_length ? ( $operation == 'DECODE' ? substr ( $string , 0, $ckey_length ): substr (md5(microtime()), - $ckey_length )) : '' ; |
11 | $cryptkey = $keya .md5( $keya . $keyc ); |
12 | $key_length = strlen ( $cryptkey ); |
14 | $string = $operation == 'DECODE' ? base64_decode ( substr ( $string , $ckey_length )) : sprintf( '%010d' , $expiry ? $expiry + time() : 0). substr (md5( $string . $keyb ), 0, 16). $string ; |
15 | $string_length = strlen ( $string ); |
21 | for ( $i = 0; $i <= 255; $i ++) { |
22 | $rndkey [ $i ] = ord( $cryptkey [ $i % $key_length ]); |
25 | for ( $j = $i = 0; $i < 256; $i ++) { |
26 | $j = ( $j + $box [ $i ] + $rndkey [ $i ]) % 256; |
32 | for ( $a = $j = $i = 0; $i < $string_length ; $i ++) { |
34 | $j = ( $j + $box [ $a ]) % 256; |
38 | $result .= chr (ord( $string [ $i ]) ^ ( $box [( $box [ $a ] + $box [ $j ]) % 256])); |
41 | if ( $operation == 'DECODE' ) { |
42 | if (( substr ( $result , 0, 10) == 0 || substr ( $result , 0, 10) - time() > 0) && substr ( $result , 10, 16) == substr (md5( substr ( $result , 26). $keyb ), 0, 16)) { |
43 | return substr ( $result , 26); |
48 | return $keyc . str_replace ( '=' , '' , base64_encode ( $result )); |
52 | echo authcode( 'www.w3note.com' , 'ENCODE' , 'abc123456' ).'<br>; |
53 | $keycode = '8207otGoCcELKJX1/Puhf/yHqmpUq91JXUFOXZoA7B6bWXVMIlSQi53GYQ' ; |
54 | echo authcode( $keycode , 'DECODE' , $key = 'abc123456' ); |
先来了解一下有关authcode()的四个参数,一般情况下只用到前三个:
$string 提供需要加密的字符串
$operation 加密方式,ENCODE是加密,DECODE是解密
$key 密钥,在整合程序时填写的密钥。
在上现的程序中,$keycode是加密后的字符串,这个程序很有趣,同样的字符串如“www.w3note.com”,每次运行程序后得到的$keycode都是不同的,但是万变不离其踪,不管$keycode是怎样变化,被解密后都被还原为原来的样子。
还记得前面ThinkPHP3.1.2整合UCenter详解(四)实现同步登录的关键代码吗?如下
1 | $loginurl = $ucService ->uc_synlogin( $uidarray ); |
$loginurl打印出来的其实就是一些加密后的字符串,如下
把加密后的code部分解密,其实就是
action=synlogin&username=qqabc&uid=1&password=bd7c0165cc61b594778ac6f548d6aa35&
time=1358932225
本文首发网志博客,欢迎转载!转载请注明本文地址,谢谢。
本文地址:http://w3note.com/web/76.html