1

我想加密/解密密码以使用 AES(Java API)将其存储在数据库中,如下所示:

try {
       SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
       byte[] salt = new byte[10];
       secureRandom.nextBytes(salt);
       byte[] encryptedPassword = //some method to mix salt with plain password
       Cipher cipher = Cipher.getInstance("AES");
       SecretKeySpec skeySpec = new SecretKeySpec(secretKey.getEncoded(), "AES");
       cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

       return cipher.doFinal(encryptedPassword);

     } catch (NoSuchAlgorithmException |
              UnsupportedEncodingException |
              NoSuchPaddingException |
              InvalidKeyException |
              IllegalBlockSizeException |
              BadPaddingException ex) {
                 //Logger...
     }

我的问题是——我可以在商业应用中免费使用 AES 吗?如何改进上面的代码?

4

2 回答 2

4

1997 年,NIST提出了用于 AES 的潜在算法的请求。在这个请求中,要求之一是算法是免版税的。

所以算法本身是完全免费的。然而,这并不意味着算法的实现是免费的。

Oracle 的实现是根据 Oracle 二进制代码许可证 (BCL) 获得许可的,根据Java SE 一般常见问题解答,该许可证是免费提供的。

所以是的,您可以免费在商业应用程序中使用它。

于 2013-08-23T00:38:36.503 回答
0

是的,您可以免费使用 AES,但出口限制可能适用于特定国家/地区。这对美国来说尤其如此。

不过,我会更担心你的协议。请查看有关 PBKDF2 和密码存储的问题。此外,Java 默认使用 ECB 模式加密,这对于字符串使用是不安全的。我没有看到您将盐与密文一起存储。仅调用secretKey.getEncoded()将其放入 aSecretKeySpec不是很有用,假设它secretKey已经是 AES 密钥。

于 2013-08-23T00:28:00.217 回答