首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法解密以PBKDF2格式以javascript cryptoJS格式加密的字符串?

有没有办法解密以PBKDF2格式以javascript cryptoJS格式加密的字符串?
EN

Stack Overflow用户
提问于 2021-03-06 14:31:26
回答 1查看 1.8K关注 0票数 1

嗨,我正在用普通的html.I开发一个密码管理器web应用程序。我用cryptoJS客户端加密将密码存储在防火墙中,现在使用aes进行加密。我还使用了防火墙身份验证,aes加密的秘密短语是firebase提供的uid,代码如下

代码语言:javascript
运行
复制
  var user = firebase.auth().currentUser;
myPassword = user.uid+"QWERTYUIOPLKJHGASDFZXCVMNBqwertyuiopasdfghjklzxcvbnm1234567890!@#$)(*&^%-+=><,.:;{}[]"; 
encrypted = CryptoJS.AES.encrypt(document.getElementById("id").value, myPassword);

PBKDF2加密看起来像这样

代码语言:javascript
运行
复制
var salt = CryptoJS.lib.WordArray.random(128 / 8);var key512Bits1000Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, {keySize: 512 / 32,iterations: 1000});

有人能告诉我们如何解密上面代码↑之后的结果吗?

EN

回答 1

Stack Overflow用户

发布于 2021-03-07 11:47:09

一点密码散列

PBKDF2是一个基于密码的密钥派生函数,如bcrypt、scrypt和Argon2,其中Argon2是2015年密码哈希竞赛的赢家(尽可能使用Argon2id )。他们过去常常从密码中提取密钥。那么问题是

为什么我们需要一个特殊的函数来从密码中派生密钥而不是只使用 hash(password)

答案取决于历史的进步。首先,记住攻击总是变得更好,永远不会变得更糟。菲利普·奥奇斯林介绍的彩虹桌

实际上是默克-赫尔曼工作的延伸,并应用于实际案例中。

  • 1980年-- Hellman,M.一种密码分析的时间-记忆交换

彩虹桌

彩虹表只用于反转任何函数,如加密和哈希函数。当谈到相反的哈希函数时,必须小心,在这种情况下,它只是查找图像前的x,这样就可以为给定的哈希值y找到y=hash(x)。今天,人们可以在网上找到许多预先制作好的彩虹桌。

彩虹桌的防御是什么?每个密码使用不同的盐分。在这种情况下,彩虹桌是无用的。他们需要为每盐建造,这是太昂贵了。因此,我们可以说,使用盐杀死彩虹桌。

大规模GPU/ASIC/FPGA搜索

虽然我们也可以使用CPU进行大规模并行化来进行密码搜索,但是ASIC/FPGA (只在其余部分使用word GPU )更有效,因为CPU是一个通用的处理单元,而不是专门的处理单元。

攻击者可以使用多个GPU来搜索密码。哈希猫就是一个很好的例子。攻击者可以并行使用多个实例来搜索密码。这只是一台平行的蛮力机器。

对策是什么?

  • iteration :您可以增加迭代。假设您使用SHA进行密码散列,则x-iteration将调用SHA x timesSHA(SHA(...(SHA(x)...))。这将减慢您的x时间,但是,它们也会减慢攻击者的x时间。 PBKDF2将迭代作为参数来控制这一点。一个必须小心迭代计数,您可能不希望您的用户等待太多的登录。调整此值是自定义的,以便用户等待的时间不超过一秒钟。100K,250K,500K,1M迭代我们今天能看到的。考虑一下,即使您使用100 K迭代,然后您也放慢了密码搜索100 K的次数。
  • Memory-Hard:在这种情况下,密码哈希算法使用的可调内存不能压缩时间内存或类似的技术,因此它们也消除了大量的搜索。GPU没有足够的内存来提供所有线程,因此它们严重瘫痪。
  • Parallelism:Argon2也使用并行化参数。这也减少了攻击者在CPU上的并行运行。

回到您的编码

代码语言:javascript
运行
复制
myPassword = user.uid+"QWERTYUIOPLKJHGASDFZXCVMNBqwertyuiopasdfghjklzxcvbnm1234567890!@#$)(*&^%-+=><,.:;{}[]"; 
encrypted = CryptoJS.AES.encrypt(document.getElementById("id").value, myPassword);

当您以这种方式使用CryptoJS加密时,它使用非标准化的OpenSSL KDF进行密钥派生(EvpKDF),并以MD5作为散列算法和1次迭代。

虽然MD5对预映像仍然是安全的,但它对于密码哈希来说是快速的。因此,您需要更改它。可以将PBKDF2与加密作为结合使用。

代码语言:javascript
运行
复制
function encrypt (msg, pass) {
  var salt = CryptoJS.lib.WordArray.random(128/8);
  
  var key = CryptoJS.PBKDF2(pass, salt, {
      keySize: keySize/32,
      iterations: iterations
    });

  var iv = CryptoJS.lib.WordArray.random(128/8);
  
  var encrypted = CryptoJS.AES.encrypt(msg, key, { 
    iv: iv, 
    padding: CryptoJS.pad.Pkcs7,
    mode: CryptoJS.mode.CBC
    
  });
  
  // salt, iv will be hex 32 in length
  // append them to the ciphertext for use  in decryption
  var transitmessage = salt.toString()+ iv.toString() + encrypted.toString();
  var encodeB4 = CryptoJS.enc.Base64.stringify(transitmessage);
  return encodeB4;
}

function decrypt (transitmessage, pass) {
  var decoded = const decoded = CryptoJS.enc.Utf8.stringify(transitmessage);

  var salt = CryptoJS.enc.Hex.parse(decoded.substr(0, 32));
  var iv = CryptoJS.enc.Hex.parse(decoded.substr(32, 32))
  var encrypted = decoded.substring(64);
  
  var key = CryptoJS.PBKDF2(pass, salt, {
      keySize: keySize/32,
      iterations: iterations
    });

  var decrypted = CryptoJS.AES.decrypt(encrypted, key, { 
    iv: iv, 
    padding: CryptoJS.pad.Pkcs7,
    mode: CryptoJS.mode.CBC
    
  })
  return decrypted;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66506776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档