Java 从 Angular-Cryptography 解密 AES 字符串的方法

Java method to decrypt an AES string from Angular-Cryptography

我正在尝试使用一种登录方法来保证客户端密码在我的服务器中的安全和加密。

我使用的库来自 Angular,是 https://github.com/middleout/angular-cryptography

思路是,按照以下步骤进行:

  1. 我在 module.config 中放了盐:

    app.config(['$cryptoProvider', function($cryptoProvider){
        $cryptoProvider.setCryptographyKey('thisismysalt');
    }]);
    
  2. 我用自己加密密码:

    user.pw = $crypto.encrypt(user.pw, user.pw);
    
  3. 如果我正在注册用户,我会用自己重新加密密码(重复步骤 2)并将其保存在数据库中。如果我正在记录,我只是将最后一步的结果发送到服务器。

  4. 当你用单密字符串解密双密字符串时,你又得到了单密字符串。因此,如果您的密码正确,您只需将结果与单一加密字符串进行比较,然后验证用户。


好的,这个方法应该有效(我之前已经在 Node 中使用过),与 SSL 配合使用效果很好,即使在您的服务器中也能保护用户的密码!

但是我在 Java 中找不到任何可以做到这一点的库或片段。我尝试了很多,但它们很难理解,当我将它们适应我的程序时,它们就是行不通。我尝试了以下方法:

static String IV = "AAAAAAAAAAAAAAAA";
static String plaintext = "test text 123[=14=][=14=][=14=]"; /*Note null padding*/
static String encryptionKey = "0123456789abcdef";

public static String decrypt(byte[] cipherText, String encryptionKey) throws Exception{
    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding", "SunJCE");
    SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
    cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
    return new String(cipher.doFinal(cipherText),"UTF-8");
}

我将它作为第一个参数传递给它,即来自数据库的双重加密密码,作为第二个参数传递给来自前端的单加密密码:

java.security.InvalidKeyException: Invalid AES key length: 44 bytes

我是不是做错了什么?我应该使用不同的算法吗?

middleout/angular-cryptography 使用 CryptoJS 3.1.2 under the hood with the least effort possible.

所以

return $crypto.encrypt(plaintext, password);

相同
$cryptoProvider.setCryptographyKey(password); 
return $crypto.encrypt(plaintext, password);

相同
return CryptoJS.AES.encrypt(plaintext, password).toString();

我在回答 中描述了如何在 Java 中做同样的事情。


如果您使用的是 SSL/TLS,额外进行此加密并没有多大好处。密码已通过互联网以加密方式发送。更糟糕的是,由于密码必须在服务器端可用,因此您必须以明文形式存储密码。 事情不是这样的。

您需要使用散列代替一些强大的散列,例如 PBKDF2、bcrypt、scrypt 和 Argon2。由于散列函数是单向函数,您将无法 "decrypt" 散列。为了验证您的用户,您可以 运行 通过哈希函数再次输入密码,以便与存储在数据库中的哈希值进行比较。由于您已经在使用 SSL/TLS,密码在传输过程中已经受到保护。查看更多:How to securely hash passwords?