加密模块在IBM API Connect中不起作用

问题描述

在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 文件。 单击应用。 如果未显示错误,则密钥已成功读取。 点击保存。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...