发文时间:2020年08月02日 19:12:04 编辑:Aaron 标签:每日一题 1326
在日常的开发设计中,涉及到数据传输或数据的存储安全性,可通过特定的算法将数据明文加密。
1、对称加密中的加密和解密都是使用同一个密钥。
2、非对称加密中采用两个密钥一个作为加密(公钥),一个作为解密(私钥)。
3、非对称加密和解密花费时间会较长一些,速度相比对称加密会慢一些。
4、非对称加密安全性较高,对称加密安全性较低。
以前我觉得项目中API一般都会有HTTPS的前提下,为什么还要做签名验证呢,其实不然 因HTTPS通常只是单向验证,即为验证当前服务器是否为真的服务器,我们通过http的get或post方式请求服务器时,会面临着很多安全性的问题,例如:
1.当前请求来源或身份是否合法
2.请求的参数是否被篡改
3.请求的唯一性,即为不可复制
.... 等等
为保证请求数据的正确性,当请求中的某一个字段值发生改变时,原有的签名的就会发生变化,只要参数变化签名也要发生变化,否则请求将会是一个无效的请求。
获取商定的token值(token可以为md5加密的值,或随机生成的字符串,确保其具有唯一性即可,这里的token即为私钥的概念),通过特定的算法对参数进行处理,如按指定的顺序打乱或自然排序,后而将得到的值加入到请求接口中。
<?php /* * 签名验证demo */ //1、获取当前用户的token值 $token ='AaronRGCxzc6545fd434f4gF545asd'; //2、假设当前api的值如下,把参数按规则重新排序重组 $apiData=[ 'name'=>'Aaron', 'age'=>18, 'sex'=>'男', 'aid'=>1,//用户id 'token'=>$token,//私钥 ]; //print_r($apiData); //原顺序 Array ( [name] => Aaron [age] => 18 [sex] => 男 [aid] => 1 [token] => AaronRGCxzc6545fd434f4gF545asd ) //按照 ASCII 字符顺序进行升序排列(也就是所谓的自然顺序) sort($apiData); //print_r($apiData); //改变顺序后 Array ( [0] => Aaron [1] => AaronRGCxzc6545fd434f4gF545asd [2] => 男 [3] => 1 [4] => 18 ) //3、通过顺序算法取出参数值 $sign=''; for ($i = 0; $i < count($apiData); $i++) { //todo 关于这里的顺序可自定义 可复杂化。本案例只做演示,重在思路。 $sign=$sign.$apiData[$i]; } //4、$sign签名值加密 print_r($sign);//AaronAaronRGCxzc6545fd434f4gF545asd男118 $sign=md5($sign);//md5加密后的值 b2aa598bc2da255b146b1c2068be7568 //5、在api接口中传入字段sign值 /* 譬如原接口 http://www.aaroner.cn/getUserInfo?name=Aaron&age=18&sex=男&aid=1 改进接口 http://www.aaroner.cn/getUserInfo?name=Aaron&age=18&sex=男&aid=1& sign=b2aa598bc2da255b146b1c2068be7568 服务器端生成签名验证: 1. 获取客户端传过来的 sign 和 参数 2. 根据 uid 去数据库查询当前用户的 token 3. url 获取的数据和数据库查询的 token 组合成数据用同样的排序算法生成签名 4. 用服务器的签名和客户端的做对比如果一样表示没有篡改。 */ //6、请求的唯一性解决方案: /* 为了防止别人重复使用请求参数问题,我们需要保证请求的唯一性,就是对应请求只能使用 一次,这样就算别人拿走了请求的完整链接也是无效的。唯一性的实现:在如上的请求参数中 ,我们加入时间戳 :timestamp(yyyyMMddHHmmss), 同样时间戳作为请求参数之一, 也加入 sign 算法中进行加密。 服务器获取到客户端传入的时间戳和本地时间做对比, 如果两个时间的差值大于一个值,表示请求是无效的。 如何解决时间差问题: 1、第一次打开应用获取本地时间,然后请求接口获取服务器时间。 2、把时间差保存到本地存储 3、请求接口的时候把本地时间和时间差相加。 */ die;
若无特殊说明,此文章为博主原创。 写稿不易,如需转载,请注明出处: https://www.aaroner.cn/art/70.html
了解过(非)对称加密解密吗?有没有在开发中做过一些实践或应用
发文时间:2020年08月02日 19:12:04 编辑:Aaron 标签:每日一题 1326
在日常的开发设计中,涉及到数据传输或数据的存储安全性,可通过特定的算法将数据明文加密。
对称加密和非对称加密的区别
1、对称加密中的加密和解密都是使用同一个密钥。
2、非对称加密中采用两个密钥一个作为加密(公钥),一个作为解密(私钥)。
3、非对称加密和解密花费时间会较长一些,速度相比对称加密会慢一些。
4、非对称加密安全性较高,对称加密安全性较低。
在实际开发中为什么要做签名加密验证
以前我觉得项目中API一般都会有HTTPS的前提下,为什么还要做签名验证呢,其实不然 因HTTPS通常只是单向验证,即为验证当前服务器是否为真的服务器,我们通过http的get或post方式请求服务器时,会面临着很多安全性的问题,例如:
1.当前请求来源或身份是否合法
2.请求的参数是否被篡改
3.请求的唯一性,即为不可复制
.... 等等
常用的签名实现原理(php案例)
为保证请求数据的正确性,当请求中的某一个字段值发生改变时,原有的签名的就会发生变化,只要参数变化签名也要发生变化,否则请求将会是一个无效的请求。
获取商定的token值(token可以为md5加密的值,或随机生成的字符串,确保其具有唯一性即可,这里的token即为私钥的概念),通过特定的算法对参数进行处理,如按指定的顺序打乱或自然排序,后而将得到的值加入到请求接口中。
若无特殊说明,此文章为博主原创。
写稿不易,如需转载,请注明出处: https://www.aaroner.cn/art/70.html