Javascript Crypto JS:你能在不增加指数级文件大小的情况下降低解密速度吗?
我有以下资料:Javascript Crypto JS:你能在不增加指数级文件大小的情况下降低解密速度吗?,javascript,encryption,cryptography,cryptojs,brute-force,Javascript,Encryption,Cryptography,Cryptojs,Brute Force,我有以下资料: let original = 'something' let passphrase = uuidv4() // will take place on the server let encrypted = CryptoJS.AES.encrypt(original, passphrase) // will take place on the browser // I want this part to take ≈ 10 minutes *minimum* let decry
let original = 'something'
let passphrase = uuidv4()
// will take place on the server
let encrypted = CryptoJS.AES.encrypt(original, passphrase)
// will take place on the browser
// I want this part to take ≈ 10 minutes *minimum*
let decrypted = CryptoJS.AES.decrypt(encrypted, passphrase)
我尝试了一种迭代方法。控制所需的解密迭代意味着您还可以在某种程度上控制解密时间:
// increase this until we reach the desired decryption time on the browser
let numberOfEncryptions = 2
// will take place on the server
let encrypted = CryptoJS.AES.encrypt(original, passphrase).toString()
let i = 0
while (i < numberOfEncryptions) {
encrypted = CryptoJS.AES.encrypt(encrypted, passphrase).toString()
i++
}
// will take place on the browser:
let decrypted = CryptoJS.AES.decrypt(encrypted, passphrase).toString(CryptoJS.enc.Utf8)
i = 0
while (i < numberOfEncryptions) {
decrypted = CryptoJS.AES.decrypt(decrypted, passphrase).toString(CryptoJS.enc.Utf8)
i++
}
await checkWithServer(decrypted) // returns true
我发现键
必须相当“简单”,而不是像我最初认为的那样是uuidv4()
。否则,这可能需要很长时间。另外,我使用的暴力(暴力)强制方法需要一个角色“池”,我猜池越大,所需时间越长
我的问题是,用户不会花时间解密实际数据。所以感觉像是战俘,也就是说假装的
但是我会考虑这次回答的问题,并在这里停止。p>
我最初的目标显然是不可能的。谢谢您的帮助。不要给出密钥,请给出密钥的哈希值。蛮力密钥的长度将为您提供所需的粒度 加密过程:
MD5(hunter2)
(使用不同的算法)
在散列中加入一些盐,以防止rainbow表的有效使用
伪代码:
// Encrypt
let key = "password";
let aesKey = md5(password);
let hint = sha1(password);
let encryptedData = data.encrypt(aesKey);
let decryptedData = data.decrypt(md5(bruteForceSha1(hint));
你能详细说明一下你为什么需要这个吗?可能还有更好的方法。我想你没有牢记:“不要向用户提供完整的解密密码短语。只提供部分密钥,让他们猜测/搜索其余的密钥。”我这么做了,但现在交给我的要求是这个最短时间限制。无论我要求用户解密什么类型的数据,我如何控制它?希望这篇文章的格式更清晰,而不仅仅是重复:)@SlavaKnyazev I更新了更多的细节。如果可能的话,你能给我一个简短的例子(用Javascript)吗?在这个例子中,交给用户的密钥会被强制使用(使用某种方法)在一台普通的浏览器/机器上,暴力强制完成所需的时间大约为10-20分钟。如果它太多,我会接受你的答案,不管:-)(我不会再问另一个操作-并为噪音感到抱歉)我的CryptoJs知识非常有限我如何“在散列中加入一些盐”?还有一个好的Js暴力强制模块可以用来测试这个吗?:)对散列加盐意味着向值中添加一个常量。这是因为hunter2的哈希值是众所周知的,可以在数据库中查找。“hunter2sfsavvgdarfsaf”的哈希值不是。哈希值在本地被强制执行,无需发出任何请求。
// Encrypt
let key = "password";
let aesKey = md5(password);
let hint = sha1(password);
let encryptedData = data.encrypt(aesKey);
let decryptedData = data.decrypt(md5(bruteForceSha1(hint));