tinyCrypto.encrypt() 在 MS Edge 中失败,但在 Chome 中工作

M Q*_*inn 5 javascript google-chrome cryptojs microsoft-edge

我正在尝试设置一个客户端脚本,该脚本将对大小小于 2MB 的文件进行加密以上传到 SharePoint 文档库。对于包含个人身份信息 (PII)(例如社会安全号码等)的文件,加密是必需的。下面的代码在谷歌浏览器中完美运行,但在 MS Edge 中的 .encrypt(...) 部分失败。

Edge 将为 .encrypt(...) 函数创建所有需要的结果/缓冲区;但是,它返回“由于错误 8070000b 无法完成操作”。结果。我已经看到其他一些董事会谈论 Edge 并且需要在 .generateKey(...) 和 .encrypt(...) 脚本中包含“哈希”参数;但是,这对我的问题没有任何影响。

我错过了什么?

file = document.getElementsByName('aFile')[0].files[0]
function encrypt() {
  window.crypto.subtle.generateKey(
    {
      name: "AES-GCM",
      length:256,
    },
    true,
    ["encrypt", "decrypt"]
  )
  .then(function(key) {
    pks = key
    crypto.subtle.exportKey( "raw", key)
    .then(function(buf) { 
      newKey = new Int8Array(buf)
      exportedAsBase64 = _arrayBufferToBase64(buf);
    })
    .then(function() {
      reader = new FileReader()
      reader.readAsDataURL(file)
      reader.onload = function() {
        fileString = reader.result,
          n=fileString.indexOf(";base64,") + 8;
        X = _base64ToArrayBuffer(fileString.substring(n))
        crypto.subtle.encrypt({name: 'AES-GCM', iv: newKey}, pks, X)
        .then( function(buf) {
           newFile = new Int8Array(buf) 
           encrypted = _arrayBufferToBase64(buf);
        })
        .catch(function (err) {
          console.error(err);
        }); 
      }
    })
  })
}

function _base64ToArrayBuffer(base64) {
    var binary_string =  window.atob(base64);
    var len = binary_string.length;
    var bytes = new Uint8Array( len );
    for (var i = 0; i < len; i++)        {
        bytes[i] = binary_string.charCodeAt(i);
    }
    return bytes.buffer;
}
Run Code Online (Sandbox Code Playgroud)