了解过(非)对称加密解密吗?有没有在开发中做过一些实践或应用


发文时间:2020年08月02日 19:12:04     编辑:Aaron      标签:每日一题 1119


在日常的开发设计中,涉及到数据传输或数据的存储安全性,可通过特定的算法将数据明文加密。

对称加密和非对称加密的区别

    1、对称加密中的加密和解密都是使用同一个密钥。

    2、非对称加密中采用两个密钥一个作为加密(公钥),一个作为解密(私钥)。

    3、非对称加密和解密花费时间会较长一些,速度相比对称加密会慢一些。

    4、非对称加密安全性较高,对称加密安全性较低。

在实际开发中为什么要做签名加密验证

   以前我觉得项目中API一般都会有HTTPS的前提下,为什么还要做签名验证呢,其实不然 因HTTPS通常只是单向验证,即为验证当前服务器是否为真的服务器,我们通过http的get或post方式请求服务器时,会面临着很多安全性的问题,例如:

      1.当前请求来源或身份是否合法

      2.请求的参数是否被篡改

      3.请求的唯一性,即为不可复制

                .... 等等

常用的签名实现原理(php案例)

     为保证请求数据的正确性,当请求中的某一个字段值发生改变时,原有的签名的就会发生变化,只要参数变化签名也要发生变化,否则请求将会是一个无效的请求。

     获取商定的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;


WX20220706-094917.png

 

若无特殊说明,此文章为博主原创。
写稿不易,如需转载,请注明出处: https://www.aaroner.cn/art/70.html




  猜你喜欢的文章

SITE MAP

  FOLLOW US