首页 > 解决方案 > 使用加密生成 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).

标签: javascriptcryptography

解决方案


通常IV应该是随机的而不是恒定的。IV 是公开的,因此您可以并且应该将其与加密文本一起存储。最好的解决方案是使用标准格式进行加密,例如 PKCS#7 的封装数据,但您需要一个不同的库,例如 Forge。

由于 IV 通常具有固定长度,因此您可以简单地将 IV 与加密数据一起存储在文件中之前,或者将其放入 json 结构中,如下例所示,然后将结构保存在文件中。请记住,在必须将其转换为“可打印”字符串(例如:十六进制字符串、base 64 等)之前,您不能将原始二进制数据放入 json 结构中。

{ 
   "iv" : "...iv data...",
   "encrypted" : "...encrypted_data_.."
}

推荐阅读