从nodejs中的asp.net成员框架解密密码

Decrypt passwords from asp.net membership framework in nodejs

我正在尝试从 node.js 应用程序中的成员框架解密密码。

当我从成员框架User.GetPassword().

获得明文版本时,它们能够被解密

我尝试了以下方法,但这不起作用:

let encryptedPassword = 'LqOz9My...';
let passwordSalt = 'JQ2...';
let validationKey = '0123456789ABCEF';
let decryptionKey = '0123456789ABCEF';
var algorithm = 'aes128';

var decipher = crypto.createDecipher(algorithm, decryptionKey);
var decryptedPassword = decipher.update(encryptedPassword, 'utf8', 'utf8') + decipher.final('utf8');

解决方法如下:

let salt = '<my base64 salt>';
let saltBuffer = Buffer.from(salt, 'base64'); // 16 bytes
let decryptionKey = '<my hex decryption key>';
let decryptionKeyBuffer = Buffer.from(decryptionKey, 'hex');  // 24 bytes
var algorithm = 'aes192';
let encryptedPassword = '<my base64 encoded, encrypted string>';

var decipher = crypto.createDecipheriv(algorithm, decryptionKeyBuffer, saltBuffer);
decipher.setAutoPadding(false);
var dec = decipher.update(encryptedPassword, 'base64', 'utf8');
dec += decipher.final('utf8');
console.log(dec);

问题是我使用了错误的编码和错误的加密。这是我的计算方法。

加密

您可以通过解密密钥的长度轻松确定加密算法类型。在我的例子中,一旦我将密钥转换为 Buffer,长度为 24,因为 24 * 8 = 192,我的算法是 aes192;

编码

在我的原始示例中,我将加密密码的编码为utf8。编码实际上是 base64。除了尝试各种接受的参数之外,不确定如何确定这一点。