Postman RSA 加密

8
我想利用Postman测试一个需要使用RSA加密算法的REST API。我注意到Postman提供了使用AES加密算法的功能(通过require('crypto-js')),但该库不提供RSA加密算法。那么我要怎样使用Postman来自动化RSA加密呢?
整个流程如下:
1. 调用一个REST API以获取RSA公钥。 2. 将RSA公钥存储在变量中。 3. 在发送请求之前,利用该公钥对要发送的值进行加密。
2个回答

4
我创建了一个小型的“库”,用于在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

2
我已将此示例添加到库中的Postman集合,位于此处https://github.com/joolfe/postman-util-lib/tree/master/postman - joliva
1
我该如何使用你之前在GitHub上分享的JSON数据? - steve y
2
嗨,史蒂夫,这些JSON是Postman集合,所以您只需要按照此处描述的方式在您的POSTMAN应用程序中导入即可:https://learning.getpostman.com/docs/postman/collection-runs/working-with-data-files/ - joliva
fileContent是什么?它是.pem文件吗? - Bemojo
我的密钥格式为:"-----BEGIN RSA PUBLIC KEY-----",所以pmlib.rs.KEYUTIL.getKey(pubkey)抛出了一个错误,有办法让它工作吗?提前感谢 抄送:@joliva - undefined

0
我做到了。
你需要 https://github.com/digitalbazaar/forge 并编译它,不能从CDN获取,否则无法工作。

load from your script

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);


1
这对你仍然有效吗?即使在eval forge.js之后,我仍然会得到“ReferenceError:forge未定义”。 - SimMac
这是由于在异步回调中执行了postman.setEnvironmentVariable("forgeJS", res.text())。如果您同意,请在预请求脚本中执行第一部分。或者使用此处的技巧https://community.postman.com/t/executing-sync-requests-programmatically-from-a-pre-request-or-test-scripts/14678/2 - Oleksandr Kulychok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接