在 Crypto 中复制 SubtleCrypto 时遇到问题

问题描述

我有一些代码使用 SubtleCrypto 来加密密钥并将其存储在数据库中。

对于另一个功能,我必须能够在 Node 12 中对其进行加密。如果没有 SubtleCrypto,我必须在 Crypto 中重新创建该功能。

我得到相同大小的输出,但它似乎无法被 SubtleCrypto 解密,我正试图找出我哪里出错了。

这是在浏览器上使用 SubtleCrypto 运行的代码:

key = getKeyMaterial(password)];
salt = base64ToArraybuffer(optionalSalt)
aesKey = crypto.subtle.deriveKey(
{
    name: constants.algorithms.pbkdf2,salt: salt,iterations: pbkdf2Iterations,hash: { name: constants.hash.sha256 },},key,{
    name: constants.algorithms.aesGcm,length: aesWrapKeyBitsLength,true,['wrapKey','unwrapKey']
),return {
  salt: arraybufferTobase64(salt),aesKey: aesKey,}


function getKeyMaterial(password) {
var enc = new TextEncoder();
crypto.subtle.importKey(
  constants.format.raw,enc.encode(password),{
    name: constants.algorithms.pbkdf2,false,['deriveKey']
)

如果没有 SubtleCrypto,在 Node 12 中,我不得不使用 Crypto 库。 这是我当前的代码迭代。

const ivByteLength = 12;

function wrapKey(privateKey,aesKey) {
  const IV = crypto.randomBytes(ivByteLength);
  const ALGORITHM = 'aes-256-gcm';

  const cipher = crypto.createCipheriv(ALGORITHM,aesKey,IV);
  let encrypted = cipher.update(privateKey,undefined,'binary');
  encrypted += cipher.final('binary');

  const authTag = cipher.getAuthTag();

  encrypted += authTag;
  const output = {
    wrappedKey: arraybufferTobase64(Buffer.from(encrypted,'ascii')),iv: arraybufferTobase64(IV),};
  return output;
}

async function deriveAesGcmKey(password,salt) {
  return new Promise((resolve,reject) => {
    crypto.pbkdf2(password,salt,100000,32,'sha256',(err,derivedKey) => {
      if (err) reject(err);
      else resolve(derivedKey);
    });
  });
}

function arraybufferTobase64(buffer) {
  let binary = '';
  const bytes = new Uint8Array(buffer);
  const len = bytes.byteLength;
  for (let i = 0; i < len; i += 1) {
    binary += String.fromCharCode(bytes[i]);
  }
  return btoa(binary);
}

function base64ToArraybuffer(base64) {
  const binary = atob(base64);
  const len = binary.length;
  const bytes = new Uint8Array(len);
  for (let i = 0; i < len; i += 1) {
    bytes[i] = binary.charCodeAt(i);
  }
  return bytes;
}

封装的密钥在两种实现中具有相同的大小,但 Node 生成的密钥无法在浏览器中解开。

我是否假设某些默认设置错误或什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)