Chinaunix首页 | 论坛 | 博客
  • 博客访问: 190623
  • 博文数量: 159
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1619
  • 用 户 组: 普通用户
  • 注册时间: 2016-01-10 19:58
文章分类

全部博文(159)

分类: Web开发

2016-06-08 22:20:51

关于Discuz的加密解密函数,相信大家都有所了解,该authcode函数可以说是对PHP界作出了重大的贡献,真的发觉discuz这个函数写的太精彩啦。

研究了一下这个算法,总的来说可以归纳为以下三点:

1,动态性,同一字符串使用相同的key,每次加密的密文都不一样,而解密方法只有一个,其实就是把解密的信息放到了密文上面。

2,时效性,可以自己加一个限期参数,以秒为单位,这个其实就是在密文里加入了有效时间。

3,统一性,加密和解密都用同一个函数,而且用了比较简单的异或算法。

由于该函数具有以上功能,所以适用的环境也很多,一般用于用户登陆和开发API时防刷接口等。

 代码如下

 0 验证数据有效性
        // substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 验证数据完整性
        // 验证数据有效性,请看未加密明文的格式
        if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
            return substr($result, 26);
        } else {
            return '';
        }
    } else {
        // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
        // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
        return $keyc.str_replace('=', '', base64_encode($result));
    }
}

测试代码



string(47) "d3e07W7LR+bA/vJOmLzYHn8flO4bEbuJXDPX+ZBkHAR9KwE"
string(6) "123456"

原文地址:标签:         

智能推荐

阅读(558) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~