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 装甲输出的输出,这样我就可以安全地将其保存在数据库上,然后将其转回类型化数组,以供解密函数使用。
| 归档时间: |
|
| 查看次数: |
9817 次 |
| 最近记录: |