浏览器中的简单对称 AES 加密

r.s*_*cky 5 javascript encryption mongodb

我被要求为一个简单的知识库/文章应用程序编写一个简单的加密插件。没有什么复杂的,没有花哨的多种选项,只是简单的对称加密。

所以我一直在寻找一些关于如何做到这一点的 JS 库/示例,但令人惊讶的是,我没有找到很多。大多数谷歌点击都是关于浏览器中的加密有多糟糕。那么您能否建议我可以研究的最简单的库或链接?

同时,我发现的最简单/可访问的方法是内置的 Web 加密 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)
      })
    })
  })
}
Run Code Online (Sandbox Code Playgroud)

现在,这虽然相当麻烦,但仍然有效。当然,有人以一种不那么混乱和更简单的方式做到了这一点?在我看来,多层的“thenables”看起来并不干净。

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

你们是怎么做到的?如何将其保存在数据库中?如果是“文本”,“装甲”类型化数组的最佳方法是什么?我想要一个类似于 GPG 装甲输出的输出,这样我就可以安全地将其保存在数据库上,然后将其转回类型化数组,以供解密函数使用。

Mic*_*oyd 2

请参阅crypto-js以了解非常强大的浏览器内 AES 实现。

我通常对密码和向量进行字符串化,然后使用非对称算法加密该字符串以存储在数据库中。