首页 > 解决方案 > 切换到不同的加密库

问题描述

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

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

目标是构建 Authentication 标头,如下所述:https ://docs.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key 。到目前为止,CryptoJS 方法对我来说一直有效。

任何人都可以帮忙吗?我尝试使用我在 HTML 中看到的示例,但我不理解 HMAC 示例中的许多单词。我通过 Microsoft Authentication 标头的在线教程达到了这一点,但个人并不了解它。

我尝试为这 3 个步骤捕获一些示例输出,并查看是否可以使用 NodeJS 的 Buffer.from 生成相同的输出以进出 base64,但我还没有看到与从 CryptoJS 看到的输出相同的输出.

标签: javascriptcryptography

解决方案


这是一个计算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>


推荐阅读