javascript - 使用加密生成 iv 时获得相同的 iv
问题描述
在将数据存储在 json 文件中之前,我使用加密来加密我的数据。问题是我只知道如何生成随机 iv。
我试着在网上四处寻找,但我没有找到任何关于它的信息。我还尝试将 iv 存储在 json 文件中,但它变得无法使用。
我注释掉了 html 的东西,所以我可以在 cmd 提示符下使用它。
//const submit = document.getElementById('submit')
//const username = document.getElementById('username')
//const password = document.getElementById('password')
const crypto = require('crypto')
const fs = require('fs')
const iv = crypto.randomBytes(16)
let key = '3956349e7a64b865ddcb5bac3af67490'
function load(){
const raw_data = fs.readFileSync('LJib.json')
const data = JSON.parse(raw_data)
let decipher = crypto.createDecipheriv('aes-256-cbc', key, iv)
let decrypted = decipher.update(data, 'hex', 'utf-8')
decrypted += decipher.final('utf-8')
return JSON.parse(decrypted)
}
function save(data){
data = Buffer.from(JSON.stringify(data))
let cipher = crypto.createCipheriv('aes-256-cbc', key, iv)
let encrypted = cipher.update(data, 'utf-8', 'hex')
encrypted += cipher.final('hex')
encrypted = JSON.stringify(encrypted)
fs.writeFileSync('LJib.json', encrypted)
}
function main(){
submit.addEventListener('click', function() {
var data = load()
save(data)
})
}
save({'user' : 'password'})
console.log(load())
真的,我只需要一种方法来不断获得相同的 iv,而不是随机获得crypto.randomBytes(16)
.
解决方案
通常IV应该是随机的而不是恒定的。IV 是公开的,因此您可以并且应该将其与加密文本一起存储。最好的解决方案是使用标准格式进行加密,例如 PKCS#7 的封装数据,但您需要一个不同的库,例如 Forge。
由于 IV 通常具有固定长度,因此您可以简单地将 IV 与加密数据一起存储在文件中之前,或者将其放入 json 结构中,如下例所示,然后将结构保存在文件中。请记住,在必须将其转换为“可打印”字符串(例如:十六进制字符串、base 64 等)之前,您不能将原始二进制数据放入 json 结构中。
{
"iv" : "...iv data...",
"encrypted" : "...encrypted_data_.."
}
推荐阅读
- java - 如何在 Java Web 代码中编写 Python 3 代码?
- apache - 为什么 localhost 显示“它有效!” 而不是我的文件?
- recursion - SML - 生成列表所有可能组合的函数
- reactjs - Firebase:从嵌套的 onSnapshot 获取数据时出现问题
- python-3.x - 如何动态设置 tkinter 标签的名称
- nginx - 如何根据配置更改更新 kuberenet pod?
- wordpress - 联系表格 7 到垃圾邮件文件夹
- java - 如何强制 Gradle 使用 Java 11
- java - Android Studio 无法识别 createFromAsset()
- css - 将元素高度限制为内容,并保持折叠溢出