简单的浏览器对称AES加密

时间:2016-01-19 07:32:07

标签: javascript mongodb encryption

我被要求为简单的知识库/文章应用编写简单的加密附件。没有什么复杂的,没有多种选择,只需简单的对称加密。

所以我一直在寻找一些关于如何做的JS库/例子,令人惊讶的是,我找不到很多。大多数谷歌点击是关于浏览器中的加密有多糟糕。 那么你能建议一个我可以调查的最简单的库或链接吗?

与此同时,我发现的最简单/可访问的方式是内置的Web Cryptography API。在摆弄了一下之后我想出了这个:

function strtoarr (str) {
  return new TextEncoder().encode(str)
}

function arrtostr (arr) {
  return new TextDecoder().decode(arr)
}

function salt() {
  var vector = new Uint8Array(16)
  crypto.getRandomValues(vector)
  return Array.from(vector)
}

function encrypt (txt, pas, slt, fnc) {
  var vector = new Uint8Array(slt)
  crypto.subtle.digest({name: 'SHA-256'}, strtoarr(pas)).then((res) => {
    crypto.subtle.importKey('raw', res, {name: 'AES-CBC'}, false, ['encrypt', 'decrypt']).then((key) => {
      crypto.subtle.encrypt({name: 'AES-CBC', iv: vector}, key, strtoarr(txt)).then((res) => {
        fnc(Array.from(new Uint8Array(res)), Array.from(vector))
      })
    })
  })
}

function decrypt (cyp, pas, slt, fnc) {
  var data = new Uint8Array(cyp)
  var vector = new Uint8Array(slt)
  crypto.subtle.digest({name: 'SHA-256'}, strtoarr(pas)).then((res) => {
    crypto.subtle.importKey('raw', res, {name: 'AES-CBC'}, false, ['encrypt', 'decrypt']).then((key) => {
      crypto.subtle.decrypt({name: 'AES-CBC', iv: vector}, key, data).then((res) => {
        fnc(arrtostr(res))
      }, () => {
        fnc(null)
      })
    })
  })
}

现在,虽然非常繁琐,但仍有效。当然,有人以不那么混乱和简单的方式做到了吗?多层“可能”对我来说看起来并不干净。

最后一个问题。在Mongodb上保存生成的密码和向量的最佳方法是什么?目前,我将其输出为数组。 Mongodb将其作为长整数数组。如果我不将它转换为数组,并将其输出为类型数组,那么Mongodb将其作为对象 - 而不是数组。 如果我尝试将其保存为“文本”,那么事情就会完全停止工作,我无法将其解密。

你们是怎么做到的?你如何将它保存在数据库中? 如果它是“文本”,那么“装甲”类型阵列的最佳方法是什么? 我想要一个类似于GPG铠装输出的输出,这样我就可以安全地将它保存在DB上,然后通过解密函数将其转换回Typed Array。

1 个答案:

答案 0 :(得分:2)

有关非常强大的浏览器内AES实施,请参阅crypto-js

我通常将cypher和vector字符串化,然后使用非对称算法对该字符串进行加密,以便存储在db中。