一、加密方式:
- 对称式加密:DES,AES,Base64 可以加密也可以解密。
- 非对称式加密:RSA 公钥加密,私钥解密,私钥加密,公钥解密
- 只加密不解密:MD5,SHA256 只加密不解密
二、demo演示
结合自己项目中遇到的问题和网络上的相关分享,作此总结
用到:RSA——非对称加密算法——每次加密的得到的结果位数一样,但是具体内容不一样
大致内容:请求体 json 设置 sign 参数,取 token 前 50 位再拼接上 timestamp 值,然后通过 RSA 公钥加密得到 的字符串
1、postman具体操作
需要在postman 中的pre-request里面设置,通过JavaScript代码把参数加密后,存为全局变量后,接口参数使用全局变量里的参数发起请求
Pre-request Script 编写前置脚本
1.1 脚本执行顺序
先执行前置脚本——>发起request请求——>收到接口返回结果——>执行 test script
1.2 编写前置脚本
//引入forge_min.js
const forge_url = 'https://lzq1357.gitee.io/various/forge_min.js';
//forge_min.js来自:https://raw.githubusercontent.com/loveiset/RSAForPostman/master/forge.js
// ------ 导入RSA ------//
//第一次运行从网络加载forgeJS,会导致请求失败
if(!pm.globals.has('forgeJS')){
console.log('request forge.js from ' + forge_url);
pm.sendRequest(forge_url, function (err, res) {
if (err) {
console.error(err);
} else {
console.info("request forgs.js: Succeed, please try again");
//注意:Pre-request Script中出现报错,可能会导致pm.globals.set失效
// 保存至全局变量中,forgeJs 为 key,res.text() 为value值
pm.globals.set('forgeJS', res.text());
}
}
);
return;
}
//eval函数它的作用是把对应的字符串解析成js代码并运行(将json的字符串解析成为JSON对象);
eval(pm.globals.get('forgeJS'));
//注意此处上下的BEGIN PRIVATE KEY不要删除,框架自带的
const public_key = '-----BEGIN PUBLIC KEY-----\n'+ 。。。。。'+
'-----END PUBLIC KEY-----' + '\r';
//公钥
var publicKey = forge.pki.publicKeyFromPem(public_key);
//时间戳
var timestamp = Math.round(new Date().getTime()/1000);
//获取 token
var token =pm.environment.get("token");
//拼接 token 和实际戳: token 前 50 位+timestamp
var tempStr = token.substring(0,50)+timestamp;
//------------ RSA 加密得到签名 -----------
var sign = forge.util.encode64(publicKey.encrypt(tempStr, 'RSAES-PKCS1-V1_5', {
md: forge.md.sha1.create(), mgf: forge.mgf.mgf1.create(forge.md.sha1.create())
}));
//将密文设置到环境变量
pm.environment.set("timestamp", timestamp);
pm.environment.set("sign", sign);
**值得注意的是,第一次运行时需要从网上加载一个forge_min.js脚本,不会执行加密。正常情况下第二次访问可以成功**。
2、java代码处理
通过maven引入本地的加密jar包处理——jar包放在工程文件中
3、python代码处理
3.1、安装 Crypto 模块
pip3 install Crypto
注意:该库 python2 名为 Crypto,模块内部导入全部是基于 Crypto,python3 中模块名虽然改为 crypto,内部导入依然使用的是 Crypto,因此,安装好了之后,需要找到该模块,手动修改包名为 Crypto,才可以正常使用。
3.2、加密
import base64 from Crypto.PublicKey
import RSA from Crypto.Cipher
import PKCS1_v1_5 as Cipher_pkcs1_v1_5
def rsaEncrypt(msg):
"""
公钥加密
:param msg: 要加密内容
:type msg:str
:return: 加密之后的密文
"""
key = '-----BEGIN PUBLIC KEY-----\n
公钥内容
-----END PUBLIC KEY-----\n'
publickey = RSA.importKey(key)
cipher = Cipher_pkcs1_v1_5.new(publickey)
# 分段加密
cipher_text = [] for i in range(0, len(msg), 80):
cont = msg[i:i + 80]
cipher_text.append(cipher.encrypt(cont.encode()))
# base64 进行编码
cipher_text = b''.join(cipher_text)
cipher_result = base64.b64encode(cipher_text)
# 返回密文
return cipher_result.decode()
if __name__ == '__main__':
# 待加密内容 pwd = "123qwe"
# 加密操作
en_msg = rsaEncrypt(msg=pwd)
print('加密密文:', en_msg)
参考:
Postman访问加密接口(RSA) - 简书
版权归原作者 墨撕酒家 所有, 如有侵权,请联系我们删除。