数据加密---之KMS

KMS,是Key Management Service的简称,是指通过KMS独立的密匙管理服务系统,给其他系统发放密匙,其他系统就根据这个
发放的key去加密和解密数据,这其中有几个技术点需要弄清楚。

Q:

   1:kms服务密匙的获取
   2:根据获取的密匙解码转换得到新的密匙,这其中有对应的解码算法
   3:用转换的到的新的密匙去加解密数据,一般是用AES或者RSA算法。
   4:数据加密是很频频的,对于加解密的function设计,key的获取与缓存,都是要慎重考虑,这样加密解密才会更加高效执行。

A:

   1:h配置中心获取密匙(配置中心需要对每个请求方加IP白名单,发放识别FLAG)。

   2:获取到原keystring:58d4b0376e6d4ga9b78c4288054b0f3d,33413880511808d6629d4`bec5141b72

     然后把keystring分割(str_split)到数组中去

$encrypted  = Array ( [0] => 5 [1] => 8 [2] => d [3] => 4 [4] => b [5] => 0 [6] => 3 [7] => 7 [8] => 6 [9] => e [10] => 6 [11] => d [12] => 4 [13] => g [14] => a [15] => 9 [16] => b [17] => 7 [18] => 8 [19] => c [20] => 4 [21] => 2 [22] => 8 [23] => 8 [24] => 0 [25] => 5 [26] => 4 [27] => b [28] => 0 [29] => f [30] => 3 [31] => d [32] => , [33] => 3 [34] => 3 [35] => 4 [36] => 1 [37] => 3 [38] => 8 [39] => 8 [40] => 0 [41] => 5 [42] => 1 [43] => 1 [44] => 8 [45] => 0 [46] => 8 [47] => d [48] => 6 [49] => 6 [50] => 2 [51] => 9 [52] => d [53] => 4 [54] => ` [55] => b [56] => e [57] => c [58] => 5 [59] => 1 [60] => 4 [61] => 1 [62] => b [63] => 7 [64] => 2 )

这里面有一个masks,他是一组二进制数组成的65位的字符串

$masks = '11010100101001011100001101110000101001011100001101101010000100101'

将keystring数组循环,一对一取出value的ascii值和masks的键为key的值,并按位异或运算,然后算出对应的控制字符,这样就得到新的keystring,原keystring的54位换算后会成为一个 `_`,我们把换算后的keystring的前16位存为iv,_之前的所有数组转为字符串存为seckey
            array_walk($encrypted,function (&$v,$k){
                $v = chr(ord($v)^$masks[$k]);
            });
            $iv = join('', array_slice($encrypted,0,self::AES_IV_OFFSETS));
            $seckey = join('', array_slice($encrypted,1+array_search('-',$encrypted)));

3:现在来看看加解密数据

  我这里用的是openssl_encrypt去加密,openssl_decrypt解密(openssl_mcrypt在php7已经退出历史舞台了)。
4:加解密服务的设计

    因为你的加解密服务是一个固定的服务,应该设计为一个单例模式,这个keystring,应该缓存下来,一个请求下来,要多次调用加解密服务,多次调用接口去获取密匙,这是不合理的,单例模式和缓存能解决这个问题。所以我用的是apc缓存,redis也可以,其实没有多大的效率差别。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值