邮递员 RSA 加密

Posted

技术标签:

【中文标题】邮递员 RSA 加密【英文标题】:Postman RSA Encryption 【发布时间】:2018-03-19 20:23:15 【问题描述】:

我想利用 postman 测试一个 REST API,该 API 需要使用 RSA 加密对输入字段之一进行加密。

我看到邮递员通过require('crypto-js') 提供了使用 AES 加密进行加密的功能,但我该库不提供 RSA 加密。如何使用 post man 自动执行 RSA 加密?

流程会这样工作:

    调用返回 RSA 公钥的 REST API

    将 RSA 公钥存储在变量中

    利用该公钥加密以下请求中的值 发送前

【问题讨论】:

【参考方案1】:

我创建了一个小“库”来在 Postman Pre-request 和 Tests 脚本中使用加密方法,完全支持 RSA,看看这里的教程,非常容易使用。

https://joolfe.github.io/postman-util-lib/

最好的问候。

以下是如何使用“RSAOAEP”算法进行 RSA 加密的示例:

// RSAOAEP signature example
const pubkey = '-----BEGIN PUBLIC KEY-----\n' +
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAstXEkU/agbNkQgh6a9DV\n' +
'C/WXGmNy8g+hdTOBhYUk5PfZCwTNt5SCYBLjIPhs2ZRrNuCN3PhwHRQPQOTsS6Nl\n' +
'Bzw+SjPVFBhPcbMHbJWnC87Q5ID/uAuwJjcUQXUTVspwIgfRmHvuuT7w7AYnCNvz\n' +
'B5TuPj2vVH8rij9BXkAHambaeGG7L10MPeUiVU6M0F/QKCJhEWAYGEt4NffSXETx\n' +
'zHSl8nyXxVJfnjxVhnZyZVXTIpLwvRy04hnkAoFexh7npRtnQdsLuIHtaJsm7gFY\n' +
'mxhr3Nxbh9p1pC7fHpJ+jMcxAAhA07WqYf6lOsxXHfPav1FEMX214YTsKTw68xqo\n' +
'DwIDAQAB\n' +
'-----END PUBLIC KEY-----\n'

const fileContent = 'My file content comes here...'
const keyObj = pmlib.rs.KEYUTIL.getKey(pubkey)
const encHex = pmlib.rs.KJUR.crypto.Cipher.encrypt(fileContent, keyObj, 'RSAOAEP')

console.log(encHex)
// will return the hexadecimal encoded, can be converted to many format ussing the library too

【讨论】:

我已经在github.com/joolfe/postman-util-lib/tree/master/postmangithub.com/joolfe/postman-util-lib/tree/master/postman图书馆的邮递员收藏中添加了这个例子 我如何利用你在上一条评论中在 github 上分享的这个 JSON? 嗨,史蒂夫,JSON 是邮递员的集合,所以您只需在您的邮递员应用程序中导入,如此处所述learning.getpostman.com/docs/postman/collection-runs/… 文件内容是什么?是 .pem 文件吗?【参考方案2】:

我写的。

你需要https://github.com/digitalbazaar/forge 并编译它,不是来自cdn,不能工作

从您的脚本加载

1.load script
var server = postman.getEnvironmentVariable("server");

if (!postman.getEnvironmentVariable("forgeJS")) 
    pm.sendRequest("http://" + server + "/res/forge.js", function(err, res) 
        if (err) 
            console.log(err);
         else 
            postman.setEnvironmentVariable("forgeJS", res.text());
        
    )


2.eval script and encrypt

var password = '123456';

var public_key = '-----BEGIN PUBLIC KEY-----\n' +
    pm.environment.get("rsaKey") + '\n' +
    '-----END PUBLIC KEY-----';

var jsscript = pm.environment.get("forgeJS");
eval(jsscript);

console.info(public_key)
var publicKey = forge.pki.publicKeyFromPem(public_key);
var encryptedText = forge.util.encode64(publicKey.encrypt("123456", 'RSA-OAEP',  // server Java private decrypt
    md: forge.md.sha256.create(),
    mgf1: 
        md: forge.md.sha1.create()
    
));

postman.setEnvironmentVariable("password", encryptedText);

【讨论】:

这仍然对您有用吗?即使在eval-ing forge.js 之后,我也得到了ReferenceError: forge is not defined 这是因为 postman.setEnvironmentVariable("forgeJS", res.text());在异步回调中执行。如果您可以 - 在预请求脚本中执行第一部分。或者从这里使用技巧community.postman.com/t/…

以上是关于邮递员 RSA 加密的主要内容,如果未能解决你的问题,请参考以下文章

java rsa私钥加密

非对称加密及RSA加密算法

Python的RSA加密和PBE加密

RSA  加密算法(原理篇)

Nodejs 使用node-rsa 加密数据

Nodejs 使用node-rsa 加密数据