第19课:加解密算法

加解密也是PHP中经常要用到的,加解密的实现就像房屋的锁,主要是为了安全,还有一些场景是为了方便数据的传输

常用场景:
1.登录,注册等对密码的加密入库与查询

1.1md5+salt方式加密密码 所谓slat就是双方约定好的一个密码字符串,只有你们知道,对传入的密码进行 md5(pwd . salt)处理
因为现在md5用的比较多,很容易被暴力破解,可以用sha1 sha256等用的人比较少的算法
如果觉得还不安全可以采取截取位数的方式,对md5(pwd . salt)的结果再用substr进行处理
最终结果为:
<?php $pwd = substr(md5($_POST['pwd'] . 'salt'), 6, 20); ?>

1.2 PHP5.5引入了Password Hashing函数,内核自带无需安装扩展
<?php
$password = 'www.godeye.org';//原始密码
$hash_password = password_hash($password, PASSWORD_BCRYPT);//使用BCRYPT算法加密密码
if (password_verify($password , $hash_password)) {
   echo "密码匹配";
} else {  
   echo "密码错误";
}
?>
它的实质是bcrypt,采用了一系列各种不同的Blowfish加密算法,并引入了一个work factor,这个工作因子可以让你决定这个算法的代价有多大
但是这种算法有个缺点就是只能PHP使用,而1.1的算法更加通用,和其他语言进行交互也没有障碍

2.提供的API接口的为了安全增加的加密字段
2.1 用传入参数进行加密
比如在传入参数中增加一个time参数与sign参数
time参数为当前时间戳 sign为加密字段
请求接口时可以对所有参数或者传入参数中比较有代表意义的参数进行拼接,先生成一个字符串
然后与time进行拼接,再进行md5加密或者sha1操作,生成一个唯一的字符串作为sign的值

在接收端,可以通过相同的方式操作参数,看结果是否和sign的值一致来判断请求是否合法

这个方式是用的最多也是最灵活的一种,上面只是一个例子,概况的说就是通过一定的规则处理传入参数,生成一个唯一的sign,然后在服务接收端用同样规则操作参数,看得出来的sign值是否一致
有很多变种,比如加salt或者对参数进行排序操作等等,但是原理都是相同的

2.2 借助第三方算法进行加解密
最经典的是RSA算法,很难被破解,采用的是非对称的加解密
代码见附件,里面有RSA加解密的例子

3.对称处理
base64编解码 base64_encode base64_decode
在任意进制之间相互转换 base_convert
JSON数据处理 json_encode json_decode
URL处理 rawurlencode rawurldecode

点击下载