【问题标题】:Node HmacSHA1 Seed节点 HmacSHA1 种子
【发布时间】:2019-03-06 23:11:00
【问题描述】:

我正在尝试通过 Node 发送 SOAP 请求,并与受 WSS 保护的服务通信。

我需要使用 SignedInfo 元素对 XML 响应进行签名,这需要我将生成的 Nonce 二进制密钥与从初始令牌请求返回的 Nonce 二进制密钥(PSHA1 格式)结合起来。

我已经能够使用 Java 验证这一点,通过使用以下类(其中秘密是我的客户端随机数,种子是服务器随机数):

https://github.com/apache/wss4j/blob/trunk/ws-security-common/src/main/java/org/apache/wss4j/common/derivedKey/P_SHA1.java#L57

使用以下 Java 代码:

Mac mac = Mac.getInstance("HmacSHA1");
SecretKeySpec key = new SecretKeySpec(getSharedKey(), "HmacSHA1");
mac.init(key);

String bytesToSign = "<XML_TO_SIGN_GOES_HERE>";

String signature = Base64.encodeBytes(mac.doFinal(bytesToSign.getBytes())); 

不过,我需要在 Node 项目中执行此操作,我查看了 Crypto API 和众多插件,但无法生成相同的签名。

如何使用节点为 HmacSHA1 指定种子?

【问题讨论】:

  • 您能否提供一个简单的 XML 示例,以及预期的结果?

标签: javascript node.js cryptography hmacsha1


【解决方案1】:

我最终设法到达了那里,有一个名为psha1 (https://www.npmjs.com/package/psha1) 的 NPM 模块。

使用该库,我创建了以下 generateSignature 模块,如下所示:

const crypto = require('crypto');
const psha1 = require('psha1');

export const generateSignatureValue = ({
  clientSecret,
  serverSecret,
  messageToSign,
}) => {

  const secretKey =
    psha1(clientSecret, serverSecret, 256);

  const hash =
    crypto
      .createHmac('sha1', Buffer.from(secretKey, 'base64'))
      .update(messageToSign)
      .digest('binary');

  return Buffer
    .from(hash, 'binary')
    .toString('base64');
};

export default generateSignatureValue;

这给了我想要的输出:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    相关资源
    最近更新 更多