嗨,我正在用普通的html.I开发一个密码管理器web应用程序。我用cryptoJS客户端加密将密码存储在防火墙中,现在使用aes进行加密。我还使用了防火墙身份验证,aes加密的秘密短语是firebase提供的uid,代码如下
var user = firebase.auth().currentUser;
myPassword = user.uid+"QWERTYUIOPLKJHGASDFZXCVMNBqwertyuiopasdfghjklzxcvbnm1234567890!@#$)(*&^%-+=><,.:;{}[]";
encrypted = CryptoJS.AES.encrypt(document.getElementById("id").value, myPassword);PBKDF2加密看起来像这样
var salt = CryptoJS.lib.WordArray.random(128 / 8);var key512Bits1000Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, {keySize: 512 / 32,iterations: 1000});有人能告诉我们如何解密上面代码↑之后的结果吗?
发布于 2021-03-07 11:47:09
一点密码散列
PBKDF2是一个基于密码的密钥派生函数,如bcrypt、scrypt和Argon2,其中Argon2是2015年密码哈希竞赛的赢家(尽可能使用Argon2id )。他们过去常常从密码中提取密钥。那么问题是
为什么我们需要一个特殊的函数来从密码中派生密钥而不是只使用 hash(password)
答案取决于历史的进步。首先,记住攻击总是变得更好,永远不会变得更糟。菲利普·奥奇斯林介绍的彩虹桌
实际上是默克-赫尔曼工作的延伸,并应用于实际案例中。
彩虹桌
彩虹表只用于反转任何函数,如加密和哈希函数。当谈到相反的哈希函数时,必须小心,在这种情况下,它只是查找图像前的x,这样就可以为给定的哈希值y找到y=hash(x)。今天,人们可以在网上找到许多预先制作好的彩虹桌。
彩虹桌的防御是什么?每个密码使用不同的盐分。在这种情况下,彩虹桌是无用的。他们需要为每盐建造,这是太昂贵了。因此,我们可以说,使用盐杀死彩虹桌。
大规模GPU/ASIC/FPGA搜索
虽然我们也可以使用CPU进行大规模并行化来进行密码搜索,但是ASIC/FPGA (只在其余部分使用word GPU )更有效,因为CPU是一个通用的处理单元,而不是专门的处理单元。
攻击者可以使用多个GPU来搜索密码。哈希猫就是一个很好的例子。攻击者可以并行使用多个实例来搜索密码。这只是一台平行的蛮力机器。
对策是什么?
x-iteration将调用SHA x timesSHA(SHA(...(SHA(x)...))。这将减慢您的x时间,但是,它们也会减慢攻击者的x时间。
PBKDF2将迭代作为参数来控制这一点。一个必须小心迭代计数,您可能不希望您的用户等待太多的登录。调整此值是自定义的,以便用户等待的时间不超过一秒钟。100K,250K,500K,1M迭代我们今天能看到的。考虑一下,即使您使用100 K迭代,然后您也放慢了密码搜索100 K的次数。回到您的编码
myPassword = user.uid+"QWERTYUIOPLKJHGASDFZXCVMNBqwertyuiopasdfghjklzxcvbnm1234567890!@#$)(*&^%-+=><,.:;{}[]";
encrypted = CryptoJS.AES.encrypt(document.getElementById("id").value, myPassword);当您以这种方式使用CryptoJS加密时,它使用非标准化的OpenSSL KDF进行密钥派生(EvpKDF),并以MD5作为散列算法和1次迭代。
虽然MD5对预映像仍然是安全的,但它对于密码哈希来说是快速的。因此,您需要更改它。可以将PBKDF2与加密作为结合使用。
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;
}https://stackoverflow.com/questions/66506776
复制相似问题