javascript - 切换到不同的加密库
问题描述
有一段代码在项目中使用 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 看到的输出相同的输出.
解决方案
这是一个计算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>
推荐阅读
- android - 如何将字符串转换为字节以传递到 byteArray
- unity3d - 如何将 Unity.Object 转换为泛型类成员?
- node.js - 如何在 Heroku 中正确设置节点应用程序端口号
- mongodb - 如何在 mongo 查询中将字段值作为键?
- xslt - 需要 xslt 属性来创建/格式化只有外边框的表格,没有列分隔边框
- plsql - 在plsql中将单列数据转换为多列
- java - 即使路径和名称正确,Xpath 和 className 也不起作用
- python - 无法在窗口中显示进度条
- environment-variables - 在 Sentry 中,我们只有 3 个最大变量?
- powershell - 如何获取文件夹名称中编号最大的文件夹名称?