最近在做一个新需求,何保对网络传输的证网数据安全性要求很高。 如何保障网络请求数据传输的络传安全性、一致性和防篡改呢?输的数据 我们使用了对称加密与非对称加密的结合的策略 。 首先说明一下对称加密和非对称加密的安全概念。 对称加密:采用单钥密码系统的何保加密方法 ,同一个密钥可以同时用作信息的证网加密和解密,这种加密方法称为对称加密,络传也称为单密钥加密。免费模板输的数据 非对称加密:非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥) 。安全公钥与私钥是何保一对,如果用公钥对数据进行加密,证网只有用对应的络传私钥才能解密
。因为加密和解密使用的输的数据是两个不同的密钥,所以这种算法叫作非对称加密算法。安全 将对称加密和非对称加密的优点加以整合
,参考了https加解密的实现思路
,我们自己封装实现SSL(Secure Scoket Layer 安全套接层)。 APP端发起请求和服务端返回数据加密: 我的示例代码是PHP,其他语言可以参考我的实现思路: (别问我为啥没用Go实现,甲方要求使然,哈哈哈。) 业务层controller中获得解析后的参数 生成RSA秘钥参考链接[1] RSA非对称加密的算法示例[2] [1]生成RSA秘钥参考链接: https://www.cnblogs.com/chenhaoyu/p/10695245.html [2]RSA非对称加密的算法示例: https://github.com/chenyRain/Common-Code/tree/master/RSA加密解密 本文转载自微信公众号「 程序员升级打怪之旅」,作者「王中阳Go」,可以通过以下二维码关注。 转载本文请联系「 程序员升级打怪之旅」公众号
。前言
相关概念
对称加密的特点 :
对称加密算法的优点是源码下载算法公开、计算量小、加密速度快、加密效率高。但是对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥
,然后使双方都能保存好秘钥。万一其中一方泄露秘钥 ,安全性则无法保证;如果为了提高安全性引入大量秘钥
,又会使秘钥管理会变得庞大且复杂 。非对称加密的特点:
算法强度复杂
,解密难度大,源码库安全性有保障;加密解密速度没有对称加密解密的速度快
。带来的思考
具体实现思路如下
:
业务代码封装
服务端返回数据代码
: 复制public function myMessage($data, $status = "success") { $aes = new AesSecurity(); //对称加密 $rsa = new RsaService(); //非对称加密 //1
,随机生成一个多位由数字字母组成的字符串作为本次请求的AES128密钥 16位 $aes_key = randomkeys(16); //2. 使用上述密钥对本次请求的参数进行AES128加密,得到请求参数密文,得到密文miwenData $miwenData = $aes::encrypt(json_encode($data),$aes_key); //3. 使用前后端约定的RSA公钥对1中的服务器租用密钥加密,得到miwenKey $miwenKey = $rsa->publicEncrypt($aes_key); //4. base64转码 $data = base64_encode(json_encode([ key=>$miwenKey, data=>$miwenData, ])); return Response::json($data,$this->getStatusCode(),$header=[]); }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19. 服务端解析数据代码
: 复制public function aesData(BaseFormRequest $request) { //解密数据 $data = $request->post(data,); $data = json_decode(base64_decode($data),true); $key = $data[key]; $data = $data[data]; $aes = new AesSecurity(); //对称加密 $rsa = new RsaService(); //非对称加密 //1.使用前后端约定的RSA私钥key解密,得到miwenKey(因为客户端使用公钥加密,所以服务端使用公钥解密) $miwenKey = $rsa->privateDecrypt($key); //2.使用上述miwenKey对本次请求的data参数进行AES128解密,得到请求参数密文miwenData $miwenData = $aes::decrypt($data,$miwenKey); //3.将json字符串转成数组 $data = json_decode($miwenData,true); //todo 打开时间戳校验 $time = $data[time]; //超过30秒校验失败不允许继续操作 if ($time<time()-30){ throw new Exception(访问超时,不允许操作); } return $data; }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27. 工具类:
AES对称加密 复制<?php /** * [AesSecurity aes加密,支持PHP7.1] */ class AesSecurity { /** * [encrypt aes加密] * @param [type] $input [要加密的数据] * @param [type] $key [加密key] * @return [type] [加密后的数据] */ public static function encrypt($input, $key) { $data = openssl_encrypt($input, AES-128-ECB, $key, OPENSSL_RAW_DATA); $data = base64_encode($data); return $data; } /** * [decrypt aes解密] * @param [type] $sStr [要解密的数据] * @param [type] $sKey [加密key] * @return [type] [解密后的数据] */ public static function decrypt($sStr, $sKey) { $decrypted = openssl_decrypt(base64_decode($sStr), AES-128-ECB, $sKey, OPENSSL_RAW_DATA); return $decrypted; } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30. 生成秘钥的代码
复制// 第一步:生成私钥,这里我们指定私钥的长度为1024, 长度越长
,加解密消耗的时间越长 openssl genrsa -out rsa_private_key.pem 1024 // 第二步:根据私钥生成对应的公钥 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pub // 第三步 :私钥转化成pkcs8格式
,【这一步非必须,只是程序解析起来方便】 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem1.2.3.4.5.6.7.8. 相关资料
