问题描述
在IBM API Connect中,我试图在IBM API Connect网关脚本中使用“ crypto”模块。当我测试Gatewascript是否支持密码模块时,得到如下响应
Gatewayscript中的代码:
var crypto = require('crypto');
session.output.write(crypto);
输出:
*{
"getHashes": {},"getCiphers": {},"createHash": {},"createHmac": {},"createSign": {},"createVerify": {},"createCipheriv": {},"createDecipheriv": {},"randomBytes": {}
}*
但是当我尝试使用它时,出现了500 Internal Server Error:
代码:
var crypto = require('crypto');
var key = "Alice";
var hmac = crypto.createHmac('hmac-sha256',key);
var input = "This is plaintext to hash";
var result = hmac.update(input).digest('base64');
session.output.write(result);
输出:
{
"httpCode": "500","httpMessage": "Internal Server Error","moreinformation": "Internal Error"
}
不确定哪里出了问题。我正在复制从IBM网站粘贴的确切示例。这是对加密的引用:https://www.ibm.com/support/knowledgecenter/SS9H2Y_7.7.0/com.ibm.dp.doc/crypto_js.html#crypto.createHmac
解决方法
通过使用 var key = "Alice";
,您可以告诉 datapower 使用以别名“Alice”存储的共享密钥。
如果你想使用'Alice'字符串那么你需要使用一个像var key = new Buffer("Alice");
这样的缓冲区
尽管如此,它不会工作,因为 HMAC 期望 hmac-sha1 的密钥为 160 位。 你可以这样生成它
$ dd if=/dev/random count=20 bs=1 | xxd -ps
a73e3406e7dcc5fc168d9ae9954ec6e0d85e4444
20 为 20 字节(20x8 位=160 位)
如果您想将其存储在共享对象中,您可以按照此处的描述进行操作:http://rcbj.net/blog01/2012/03/17/generating-and-uploading-a-shared-key-symmetric-key-to-datapower-appliances/
将此命令生成的十六进制字符串放入名为secret.key 的文件中。 将密钥上传到设备上的 cert:/// 目录。 导航到对象-> 加密配置-> 加密共享密钥。 单击添加。 输入共享密钥的名称。 从下拉菜单中选择刚才上传的secret.key 文件。 单击应用。 如果未显示错误,则密钥已成功读取。 点击保存。