subtleCrypto.encrypt () не работает в MS Edge, но работает в Chome - PullRequest
2 голосов
/ 01 мая 2019

Я пытаюсь настроить клиентский сценарий, который будет шифровать файлы размером менее 2 МБ для загрузки в библиотеку документов SharePoint.Шифрование необходимо для файлов, которые содержат персонально идентифицируемую информацию (PII), такую ​​как номера социального страхования и тому подобное.Приведенный ниже код отлично работает в Google Chrome, но не работает с частью .encrypt (...) в MS Edge.

Edge создаст все необходимые результаты / буферы для функции .encrypt (...);однако он возвращает «Не удалось завершить операцию из-за ошибки 8070000b».результат.Я видел, как на некоторых других форумах говорилось об Edge и необходимости включать параметр "hash" в оба скрипта .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;
}
...