javascript - 切换到不同的加密库

标签 javascript cryptography

有一段代码在项目中使用 CryptoJS 作为 npm 依赖项,但我的安全团队要求我将库切换到 msrcrypto 之类的东西。

  // let secret = CryptoJS.enc.Base64.parse("storageaccountaccesskeyfromAzureViaEnvironmentVariable");
  // let hash = CryptoJS.HmacSHA256(strToSign, secret);
  // let hashInBase64 = CryptoJS.enc.Base64.stringify(hash);

目标是构建身份验证 header ,如下所述:https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key 。到目前为止,CryptoJS 方法对我来说很有效。

有人可以帮忙吗?我尝试使用在 HTML 中看到的示例,但我不明白 HMAC 示例中的许多单词。我通过 Microsoft 身份验证 header 的在线教程了解到这一点,但我个人并不太了解其中的内容。

我 try catch 这 3 个步骤的一些示例输出,看看是否可以使用 NodeJS 的 Buffer.from 生成相同的输出以进出 Base64,但我还没有看到与我相同的输出参见 CryptoJS。

最佳答案

下面是计算 HMACSHA256(secret: [1, 2, 3, 4, 5, 6], message: [7, 8, 9, 10]) 的示例。两个库产生相同的结果:

const secret = [1, 2, 3, 4, 5, 6];
const data = [7, 8, 9, 10];

// msrcrypto
const algorithm = {
    name: 'HMAC',
    hash: {
        name: 'SHA-256'
    }
};
const jwkKey = {
    kty: "oct",
    alg: "HS256",
    k: msrCrypto.toBase64(secret),
    ext: true
};
// I don't know why, but with async mode I am getting an error in my browser
// with no meaningful message
msrCrypto.subtle.forceSync = 1;
msrCrypto.subtle.importKey("jwk", jwkKey, algorithm, true, ['sign', 'verify']).then(key => {
    msrCrypto.subtle.sign(algorithm, key, data).then(hmac => {
        const arr = new Uint8Array(hmac);
        console.log('msrCrypto: ' + msrCrypto.toBase64(arr));
    });
});

// cryptojs
const cryptoJsSecret = new CryptoJS.lib.WordArray.init(new Uint8Array(secret));
const cryptoJsData = new CryptoJS.lib.WordArray.init(new Uint8Array(data));
const hash = CryptoJS.HmacSHA256(cryptoJsData, cryptoJsSecret);
console.log('CryptoJS: ' + CryptoJS.enc.Base64.stringify(hash));
<script src="https://cdn.jsdelivr.net/npm/msrcrypto@1.5.3/msrcrypto.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.js"></script>

关于javascript - 切换到不同的加密库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54963003/

相关文章:

python - python ECDSA 和 C micro-ecc 库之间的 ECDSA 签名和验证问题

javascript - Bacon.js 如何根据另一个属性过滤事件流?

Java - 通信器中的公钥基础设施实现

javascript - 获取用户操作系统和版本号

javascript - 使用复选框上的 onclick 重定向到另一个页面

java - 在 java 中生成 OTP 并对其进行加密的最佳方法

java - 无法将 CryptoPermission 添加到 java.policy 文件

c# - 将盐与散列密码一起存储有多安全

javascript - 如何在甜蜜警报脚本运行时运行另一个 JavaScript 函数

javascript - react 非 SPA 历史