最后一个单元在使用Java 8 Base64时没有足够的有效位。

huangapple 未分类评论58阅读模式
标题翻译

Last unit does not have enough valid bits with java 8 Base64

问题

Here is the translated code:

  1. import java.security.NoSuchAlgorithmException;
  2. import java.security.spec.InvalidKeySpecException;
  3. import java.security.spec.KeySpec;
  4. import java.util.Base64;
  5. import javax.annotation.PostConstruct;
  6. import javax.crypto.Cipher;
  7. import javax.crypto.SecretKey;
  8. import javax.crypto.SecretKeyFactory;
  9. import javax.crypto.spec.GCMParameterSpec;
  10. import javax.crypto.spec.PBEKeySpec;
  11. import javax.crypto.spec.SecretKeySpec;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.stereotype.Component;
  16. @Component
  17. public class EncryptorBean {
  18. private Logger logger = LoggerFactory.getLogger(EncryptorBean.class);
  19. @Value("${security.encryptor.encryption-key}")
  20. private String encryptorEncryptionKey;
  21. @Value("${security.encryptor.salt}")
  22. private String encryptorSalt;
  23. @Value("${security.encryptor.password}")
  24. private String encryptorPassword;
  25. private static final int KEY_LENGTH = 256;
  26. private static final String ALGORITHM = "AES";
  27. private static final int ITERATION_COUNT = 65536;
  28. private static final String PBE_ALGORITHM = "PBEWithHmacSHA256AndAES_128";
  29. private static final String CIPHER_INSTANCE = "AES_256/GCM/NOPADDING";
  30. private static final int GCM_AUTHENTICATION_TAG_SIZE = 16;
  31. private transient SecretKey key;
  32. Cipher cipher;
  33. @PostConstruct
  34. public void postConstruct() {
  35. try {
  36. KeySpec spec = new PBEKeySpec(encryptorPassword.toCharArray(), encryptorSalt.getBytes(), ITERATION_COUNT, KEY_LENGTH);
  37. SecretKey skey = SecretKeyFactory.getInstance(PBE_ALGORITHM).generateSecret(spec);
  38. key = new SecretKeySpec(skey.getEncoded(), ALGORITHM);
  39. } catch (SecurityException | InvalidKeySpecException | NoSuchAlgorithmException ex) {
  40. ex.printStackTrace();
  41. }
  42. }
  43. public String encrypt(String plainText) {
  44. return encrypt(plainText, encryptorEncryptionKey);
  45. }
  46. public String encrypt(String plainText, String encryptionKey) {
  47. String cipherText = null;
  48. try {
  49. cipher = Cipher.getInstance(CIPHER_INSTANCE);
  50. GCMParameterSpec params = new GCMParameterSpec(GCM_AUTHENTICATION_TAG_SIZE * Byte.SIZE, encryptionKey.getBytes(), 0, 12);
  51. cipher.init(Cipher.ENCRYPT_MODE, key, params);
  52. byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
  53. cipherText = Base64.getEncoder().withoutPadding().encodeToString(encrypted);
  54. } catch (Exception e) {
  55. logger.warn(e.getMessage());
  56. }
  57. return cipherText;
  58. }
  59. public String decrypt(String cipherText) {
  60. return decrypt(cipherText, encryptorEncryptionKey);
  61. }
  62. public String decrypt(String cipherText, String encryptionKey) {
  63. String plainText = null;
  64. try {
  65. cipher = Cipher.getInstance(CIPHER_INSTANCE);
  66. GCMParameterSpec params = new GCMParameterSpec(GCM_AUTHENTICATION_TAG_SIZE * Byte.SIZE, encryptionKey.getBytes(), 0, 12);
  67. cipher.init(Cipher.DECRYPT_MODE, key, params);
  68. byte[] bytes = Base64.getDecoder().decode(cipherText);
  69. byte[] decrypted = cipher.doFinal(bytes);
  70. plainText = new String(decrypted, "UTF8");
  71. } catch (Exception e) {
  72. logger.warn(e.getMessage());
  73. }
  74. return plainText;
  75. }
  76. public boolean isEncoded(String cipherText) {
  77. boolean encoded = false;
  78. if (cipherText != null && !cipherText.trim().isEmpty()) {
  79. try {
  80. GCMParameterSpec params = new GCMParameterSpec(GCM_AUTHENTICATION_TAG_SIZE * Byte.SIZE, encryptorEncryptionKey.getBytes(), 0, 12);
  81. cipher.init(Cipher.DECRYPT_MODE, key, params);
  82. byte[] bytes = Base64.getDecoder().decode(cipherText);
  83. cipher.doFinal(bytes);
  84. encoded = true;
  85. } catch (Throwable e) {
  86. // handle exception
  87. }
  88. }
  89. return encoded;
  90. }
  91. }

The warning messages you are encountering usually occur when the input provided for decoding as base64 is not valid base64-encoded data. To fix this issue, you should ensure that the input you are trying to decrypt is properly base64-encoded. If you are receiving these warnings consistently, it's possible that the data you are attempting to decrypt has been corrupted or modified in some way before reaching the decryption process. Double-check the source and handling of the encrypted data to ensure its integrity.

英文翻译

I have next class for encryption and decryption:

  1. import java.security.NoSuchAlgorithmException;
  2. import java.security.spec.InvalidKeySpecException;
  3. import java.security.spec.KeySpec;
  4. import java.util.Base64;
  5. import javax.annotation.PostConstruct;
  6. import javax.crypto.Cipher;
  7. import javax.crypto.SecretKey;
  8. import javax.crypto.SecretKeyFactory;
  9. import javax.crypto.spec.GCMParameterSpec;
  10. import javax.crypto.spec.PBEKeySpec;
  11. import javax.crypto.spec.SecretKeySpec;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.stereotype.Component;
  16. @Component
  17. public class EncryptorBean {
  18. private Logger logger = LoggerFactory.getLogger(EncryptorBean.class);
  19. @Value("${security.encryptor.encryption-key}")
  20. private String encryptorEncryptionKey;
  21. @Value("${security.encryptor.salt}")
  22. private String encryptorSalt;
  23. @Value("${security.encryptor.password}")
  24. private String encryptorPassword;
  25. private static final int KEY_LENGTH = 256;
  26. private static final String ALGORITHM = "AES";
  27. private static final int ITERATION_COUNT = 65536;
  28. private static final String PBE_ALGORITHM = "PBEWithHmacSHA256AndAES_128";
  29. private static final String CIPHER_INSTANCE = "AES_256/GCM/NOPADDING";
  30. private static final int GCM_AUTHENTICATION_TAG_SIZE = 16;
  31. // the key
  32. private transient SecretKey key;
  33. Cipher cipher;
  34. /**
  35. * Post construct to creates secret key. In production we may want to avoid keeping the secret key hanging around in memory for very long.
  36. */
  37. @PostConstruct
  38. public void postConstruct() {
  39. try {
  40. // create the PBE key
  41. KeySpec spec = new PBEKeySpec(encryptorPassword.toCharArray(), encryptorSalt.getBytes(), ITERATION_COUNT, KEY_LENGTH);
  42. SecretKey skey = SecretKeyFactory.getInstance(PBE_ALGORITHM).generateSecret(spec);
  43. // recast key as straightforward AES without padding.
  44. key = new SecretKeySpec(skey.getEncoded(), ALGORITHM);
  45. } catch (SecurityException | InvalidKeySpecException | NoSuchAlgorithmException ex) {
  46. // handle appropriately...
  47. ex.printStackTrace();
  48. }
  49. }
  50. /**
  51. * Encrypt String
  52. */
  53. public String encrypt(String plainText) {
  54. return encrypt(plainText, encryptorEncryptionKey);
  55. }
  56. public String encrypt(String plainText, String encryptionKey) {
  57. String cipherText = null;
  58. try {
  59. cipher = Cipher.getInstance(CIPHER_INSTANCE); // we must use it here to avoid java.security.InvalidAlgorithmParameterException: Cannot reuse iv for GCM encryption
  60. GCMParameterSpec params = new GCMParameterSpec(GCM_AUTHENTICATION_TAG_SIZE * Byte.SIZE, encryptionKey.getBytes(), 0, 12);
  61. cipher.init(Cipher.ENCRYPT_MODE, key, params);
  62. byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
  63. cipherText = Base64.getEncoder().withoutPadding().encodeToString(encrypted);
  64. } catch (Exception e) {
  65. logger.warn(e.getMessage());
  66. }
  67. return cipherText;
  68. }
  69. /**
  70. * Decrypt String
  71. */
  72. public String decrypt(String cipherText) {
  73. return decrypt(cipherText, encryptorEncryptionKey);
  74. }
  75. public String decrypt(String cipherText, String encryptionKey) {
  76. String plainText = null;
  77. try {
  78. cipher = Cipher.getInstance(CIPHER_INSTANCE); // we must use it here to avoid java.security.InvalidAlgorithmParameterException: Cannot reuse iv for GCM encryption
  79. GCMParameterSpec params = new GCMParameterSpec(GCM_AUTHENTICATION_TAG_SIZE * Byte.SIZE, encryptionKey.getBytes(), 0, 12);
  80. cipher.init(Cipher.DECRYPT_MODE, key, params);
  81. byte[] bytes = Base64.getDecoder().decode(cipherText);
  82. byte[] decrypted = cipher.doFinal(bytes);
  83. plainText = new String(decrypted, "UTF8");
  84. } catch (Exception e) {
  85. logger.warn(e.getMessage());
  86. }
  87. return plainText;
  88. }
  89. public boolean isEncoded(String cipherText) {
  90. boolean encoded = false;
  91. if (cipherText != null && !cipherText.trim().isEmpty()) {
  92. try {
  93. GCMParameterSpec params = new GCMParameterSpec(GCM_AUTHENTICATION_TAG_SIZE * Byte.SIZE, encryptorEncryptionKey.getBytes(), 0, 12);
  94. cipher.init(Cipher.DECRYPT_MODE, key, params);
  95. byte[] bytes = Base64.getDecoder().decode(cipherText);
  96. cipher.doFinal(bytes);
  97. encoded = true;
  98. } catch (Throwable e) {
  99. // handle exception. Perhaps set value to null?
  100. // e.printStackTrace();
  101. }
  102. }
  103. return encoded;
  104. }
  105. }

But when i use it i always get a warning messages:

> Illegal base64 character 40
>
> and
>
> Last unit does not have enough valid bits

And actually in other environment i got this:

  1. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Last unit does not have enough valid bits
  2. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
  3. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  4. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
  5. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
  6. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  7. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
  8. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
  9. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
  10. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
  11. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  12. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  13. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  14. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  15. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  16. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  17. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  18. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  19. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
  20. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
  21. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  22. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  23. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  24. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  25. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  26. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  27. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  28. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  29. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
  30. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  31. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  32. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  33. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  34. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  35. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  36. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  37. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  38. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  39. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  40. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
  41. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 5f
  42. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  43. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  44. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  45. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  46. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  47. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  48. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  49. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  50. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
  51. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  52. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  53. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  54. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  55. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  56. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  57. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  58. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  59. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  60. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  61. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  62. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  63. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  64. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  65. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  66. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  67. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  68. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
  69. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  70. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  71. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  72. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
  73. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
  74. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  75. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  76. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
  77. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  78. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  79. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  80. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  81. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  82. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  83. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
  84. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  85. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  86. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  87. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
  88. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
  89. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
  90. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  91. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
  92. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
  93. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
  94. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  95. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  96. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  97. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  98. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  99. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
  100. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
  101. WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24

So why i got this warning? and how to fix it?

huangapple
  • 本文由 发表于 2020年3月17日 01:32:31
  • 转载请务必保留本文链接:https://java.coder-hub.com/60710592.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定