Javascript 切换到不同的加密库

Javascript 切换到不同的加密库,javascript,cryptography,Javascript,Cryptography,有一段代码将CryptoJS用作项目中的npm依赖项,但我的安全团队要求我将库切换到类似msrcrypto的东西 // let secret = CryptoJS.enc.Base64.parse("storageaccountaccesskeyfromAzureViaEnvironmentVariable"); // let hash = CryptoJS.HmacSHA256(strToSign, secret); // let hashInBase64 = CryptoJS.e

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

  // let secret = CryptoJS.enc.Base64.parse("storageaccountaccesskeyfromAzureViaEnvironmentVariable");
  // let hash = CryptoJS.HmacSHA256(strToSign, secret);
  // let hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
目标是按如下所述构建身份验证标头:。到目前为止,CryptoJS方法对我很有效

有人能帮忙吗?我尝试过使用HTML中的示例,但是我不理解HMAC示例中的许多单词。我是通过Microsoft身份验证标题的在线教程了解到这一点的,但我个人不太了解


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

下面是一个计算
HMACSHA256(机密:[1,2,3,4,5,6],消息:[7,8,9,10])
的示例。两个LIB产生相同的结果:

const secret=[1,2,3,4,5,6];
常量数据=[7,8,9,10];
//msrcrypto
常量算法={
名称:“HMAC”,
散列:{
名称:“SHA-256”
}
};
常量jwkKey={
kty:“十月”,
alg:“HS256”,
k:msrCrypto.toBase64(秘密),
分机:对
};
//我不知道为什么,但使用异步模式时,我的浏览器中出现了一个错误
//没有任何有意义的信息
msrCrypto.previous.forceSync=1;
msrCrypto.minute.importKey(“jwk”,jwkKey,algorithm,true,['sign','verify'])。然后(key=>{
msrCrypto.minute.sign(算法、密钥、数据)。然后(hmac=>{
const arr=新的UINT8阵列(hmac);
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);
log('CryptoJS:'+CryptoJS.enc.Base64.stringify(hash))

下面是一个计算
HMACSHA256(机密:[1,2,3,4,5,6],消息:[7,8,9,10])
的示例。两个LIB产生相同的结果:

const secret=[1,2,3,4,5,6];
常量数据=[7,8,9,10];
//msrcrypto
常量算法={
名称:“HMAC”,
散列:{
名称:“SHA-256”
}
};
常量jwkKey={
kty:“十月”,
alg:“HS256”,
k:msrCrypto.toBase64(秘密),
分机:对
};
//我不知道为什么,但使用异步模式时,我的浏览器中出现了一个错误
//没有任何有意义的信息
msrCrypto.previous.forceSync=1;
msrCrypto.minute.importKey(“jwk”,jwkKey,algorithm,true,['sign','verify'])。然后(key=>{
msrCrypto.minute.sign(算法、密钥、数据)。然后(hmac=>{
const arr=新的UINT8阵列(hmac);
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);
log('CryptoJS:'+CryptoJS.enc.Base64.stringify(hash))

Auth2显示为等于auth for me,代码如下:)


Auth2显示为等于auth,代码如下:)

谢谢您的回复!我现在遇到了一些问题,甚至是在我的电子应用程序的主进程中运行这段代码。另外,我看到的唯一主要区别是我的代码是Azure访问密钥,我相信我使用CryptoJS的第一行代码需要从base64读入它。这是怎么做到的?只有msrCrypto.fromBase64()?我的另一个选择是使用webcrypto,根据我的安全团队,它似乎遵循NodeJS中的加密。你知道我该怎么用它吗?我做到了!我将发布一个答案,显示我使用的两个库之间的比较。谢谢回复!我现在遇到了一些问题,甚至是在我的电子应用程序的主进程中运行这段代码。另外,我看到的唯一主要区别是我的代码是Azure访问密钥,我相信我使用CryptoJS的第一行代码需要从base64读入它。这是怎么做到的?只有msrCrypto.fromBase64()?我的另一个选择是使用webcrypto,根据我的安全团队,它似乎遵循NodeJS中的加密。你知道我该怎么用它吗?我做到了!我将发布一个答案,显示我使用的两个库之间的比较;加密原语已定义为字节兼容。你能至少把你的标题改成不那么普通的吗?例如,我希望这里有“HMAC”一词,这更像是一个“移植我的代码”的问题,而不是其他任何问题;加密原语已定义为字节兼容。你能至少把你的标题改成不那么普通的吗?比如说,我希望里面有“HMAC”这个词。
  let secret = CryptoJS.enc.Base64.parse("azureAccessKeyInBase64" as string);
  let hash = CryptoJS.HmacSHA256(strToSign, secret);
  let hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
  let auth = "SharedKey storageaccount:" + hashInBase64;

  console.log("auth: " + auth);

  let secret2 = Buffer.from("azureAccessKeyInBase64" as string, 'base64');
  let hmac = crypto.createHmac('sha256', secret2);
  hmac.write(strToSign);
  hmac.end();
  let hash2 = hmac.read();
  let hash2InBase64 = Buffer.from(hash2).toString('base64');
  let auth2 = "SharedKey storageaccount:" + hash2InBase64;
  console.log("auth2: " + auth);