我想用AES-256加密一个用户的数据,将其安全地存储在我的数据库中。 但是,我有一个问题,那就是密钥必须是32个字符长。 但我的用户的密码通常要短得多。 有没有办法我可以“延长”密码的长度?
我还想到了一个事实,那就是人造密码通常都很弱。 所以我需要某种将密码“链接”到加密密钥的函数?
下面是我的代码,我用它来加密和解密:
null
const crypto = require('crypto');
const algorithm = 'aes-256-cbc';
const key; //Here I would get the password of the user
function encrypt(text) {
const iv = crypto.randomBytes(16);
let cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(key), iv);
let encrypted = cipher.update(text);
encrypted = Buffer.concat([encrypted, cipher.final()]);
return { iv: iv.toString('hex'), encryptedData: encrypted.toString('hex') };
}
function decrypt(text) {
let iv = Buffer.from(text.iv, 'hex');
let encryptedText = Buffer.from(text.encryptedData, 'hex');
let decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(key), iv);
let decrypted = decipher.update(encryptedText);
decrypted = Buffer.concat([decrypted, decipher.final()]);
return decrypted.toString();
}
null
非常感谢你提前回答我的问题。
总是在文本中添加一个salt,并将其追加到文本的末尾。 salt可以是任意长度的随机生成的字符串,可以很容易地满足32个字符的长度限制。 此外,加密前加盐加强了加密。
您不应该将用户的密码直接用作密钥。 相反,您可以将它们用作密钥派生算法(如PKBDF2)的输入。
正如这篇关于PKBDF2的文章所解释的:
不幸的是,用户选择的密码一般都很短,并且缺乏足够的熵[11],[21],[18]。 由于这些原因,它们不能直接用作实现安全密码系统的密钥。 解决该问题的一个可能的解决方案是采用密钥推导函数(KDF),即一个取初始密钥材料源并从其推导出一个或多个伪随机密钥的函数。
例如,这里提供了一个用于为Node.js计算pkbdf2的库。