我正在使用Node.js上传在客户端加密的文件,我使用SJCL(Stanford Javascript Crypto Library)使用Javascript加密文件。
但我注意到即使使用相同的PassPhrase,输出或加密结果也总是不同。
经过一些研究后我发现这是因为盐每次都是随机的,我需要做一个'nosalt'(抱歉,我对这里的所有东西都是新手,加密,Node.js)
每次密码相同时,如何更改我的代码(或SJCL代码)以生成确切的加密输出。
我的应用程序基于“Cryptloader”项目,您可以在此处找到它:https://github.com/Kryil/Cryptloader
加密:
var part = file_queue[data["id"]].slice(start, end)
var reader = new FileReader()
reader.onload = function(e)
{
var passwd = document.getElementById("password").value
console.log("Uploading arraybuffer of size " + e.target.result.byteLength)
var i32a = new Int32Array(e.target.result)
var out = i32a.toJSONArray()
console.log("crypting: " + out)
var crypted = sjcl.encrypt(passwd, out)
ws.send(JSON.stringify({
"type": "fileslice",
"data": {"id": data["id"], "slice": slice, "data": crypted}
}))
}
reader.readAsArrayBuffer(part)
解密:
var decrypted = sjcl.decrypt(passwd, data["data"])
file_contents[file]["data"].push(new Int32Array(JSON.parse(decrypted)))
这是无关紧要的问题,但并非所有文件都正确上传,其中一些文件会产生错误,但是当我将Int32Array更改为Int16Array或Int8Array时,它适用于它们但会对其他文件产生错误,导致该错误的原因以及如何修理它。 错误:
Uncaught RangeError: ArrayBuffer length minus the byteOffset is not a multiple of the element size.
(Chrome Latest version, Win 7)
答案 0 :(得分:1)
salt
不仅仅是iv
,每次salt
时都会使密文不同。但这些都是安全功能,提供了你真正不应该禁用的语义安全性,也不需要禁用,因为salt和iv可以包含在密文中,没有任何东西阻止你以后解密使用随机iv
或encrypt
。
那就是说你正在使用的salt
功能允许你传递自己填写的加密参数,包括iv
和{{1}},但要将这些参数硬编码为固定值(我想强烈指出)不 api意图和滥用api。