使用Jasypt进行基于密码的AES加密和PBKDF2WithHmacSHA1密钥

时间:2015-08-06 12:13:11

标签: java aes encryption-symmetric pbkdf2 jasypt

我正在实施一种加密机制,我的工作,安全人员的要求如下:

  1. 使用PBKDF2WithHmacSHA512,密码,256位盐和20000次迭代创建256位密钥。
  2. 应使用SecureRandom.getInstance(“SHA1PRNG”)生成Salt;
  3. 使用带有派生密钥的AES256进行加密。
  4. 我正在尝试使用Jasypt的 StandardPBEStringEncryptor

    encryptor.setPassword(PASSWORD);
    encryptor.setAlgorithm("AES/CBC/PKCS5Padding");
    encryptor.setKeyObtentionIterations(20000);
    encryptor.setSaltGenerator(new RandomSaltGenerator());
    encryptor.encrypt("something");
    

    当我这样做时,我得到以下异常:

      

    java.security.NoSuchAlgorithmException:AES / CBC / PKCS5Padding SecretKeyFactory不可用

    我是否错误地使用Jasypt?我在这里缺少什么?

    由于

1 个答案:

答案 0 :(得分:4)

我最后联系了Jasypt的首席程序员DanielFernández和他的回答:

  

我担心Jasypt没有提供为SecretKeyFactory指定不同算法的方法以及Cipher本身的实例化。遗憾。

我使用了这段java代码(没有Jasypt):

public String encrypt(final String message) {
  final byte[] salt = generateSalt();
  final Key key = createKey(salt);

  final Cipher encryptingCipher = createCipher(Cipher.ENCRYPT_MODE, key, salt);
  final byte[] messageBytes = message.getBytes(StandardCharsets.UTF_8);
  final byte[] encryptedBytes = doFinal(encryptingCipher, messageBytes);
  final byte[] data = ArrayUtils.addAll(salt, encryptedBytes);
  return BaseEncoding.base64().encode(data);
}

private byte[] generateSalt() {
  final SecureRandom secureRandom = new SecureRandom();
  final byte[] salt = new byte[SALT_LENGTH];
  secureRandom.nextBytes(salt);
  return salt;
}

private Key createKey(final byte[] salt) {
  final PBEKeySpec spec = new PBEKeySpec(PASSWORD,
                                       salt,
                                       ITERATIONS,
                                       KEY_LENGTH);
  final SecretKey secretKey;
  try {
    secretKey = keyFactory.generateSecret(spec);
  } catch (final InvalidKeySpecException e) {
    throw new RuntimeException("Error creating SecretKey", e);
  }
  final SecretKeySpec result = new SecretKeySpec(secretKey.getEncoded(), ALGORITHM);
  spec.clearPassword();
  return result;
}