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>
我最初的目标显然是不可能的。谢谢您的帮助。

不要给出密钥,请给出密钥的哈希值。蛮力密钥的长度将为您提供所需的粒度

加密过程:

  • 生成一个密钥(例如:hunter2)并使用它加密数据
  • 使用诸如SHA1(f3bbbd66a63d4bf1747940578ec3d0103530e21d)等算法的散列搜索器2
  • 让客户端对密钥强制执行
  • 密钥越长,找到密钥所需的时间就越长,而有效负载的大小保持不变

    然而,这有一个缺陷——暴力强制是不必要的,因为暴力强制AES加密也同样简单。这可以通过使密钥也成为散列来通过盐渍来克服

    不使用“hunter2”加密数据,而是使用
    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));