标题翻译
Last unit does not have enough valid bits with java 8 Base64
问题
Here is the translated code:
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Base64;
import javax.annotation.PostConstruct;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class EncryptorBean {
private Logger logger = LoggerFactory.getLogger(EncryptorBean.class);
@Value("${security.encryptor.encryption-key}")
private String encryptorEncryptionKey;
@Value("${security.encryptor.salt}")
private String encryptorSalt;
@Value("${security.encryptor.password}")
private String encryptorPassword;
private static final int KEY_LENGTH = 256;
private static final String ALGORITHM = "AES";
private static final int ITERATION_COUNT = 65536;
private static final String PBE_ALGORITHM = "PBEWithHmacSHA256AndAES_128";
private static final String CIPHER_INSTANCE = "AES_256/GCM/NOPADDING";
private static final int GCM_AUTHENTICATION_TAG_SIZE = 16;
private transient SecretKey key;
Cipher cipher;
@PostConstruct
public void postConstruct() {
try {
KeySpec spec = new PBEKeySpec(encryptorPassword.toCharArray(), encryptorSalt.getBytes(), ITERATION_COUNT, KEY_LENGTH);
SecretKey skey = SecretKeyFactory.getInstance(PBE_ALGORITHM).generateSecret(spec);
key = new SecretKeySpec(skey.getEncoded(), ALGORITHM);
} catch (SecurityException | InvalidKeySpecException | NoSuchAlgorithmException ex) {
ex.printStackTrace();
}
}
public String encrypt(String plainText) {
return encrypt(plainText, encryptorEncryptionKey);
}
public String encrypt(String plainText, String encryptionKey) {
String cipherText = null;
try {
cipher = Cipher.getInstance(CIPHER_INSTANCE);
GCMParameterSpec params = new GCMParameterSpec(GCM_AUTHENTICATION_TAG_SIZE * Byte.SIZE, encryptionKey.getBytes(), 0, 12);
cipher.init(Cipher.ENCRYPT_MODE, key, params);
byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
cipherText = Base64.getEncoder().withoutPadding().encodeToString(encrypted);
} catch (Exception e) {
logger.warn(e.getMessage());
}
return cipherText;
}
public String decrypt(String cipherText) {
return decrypt(cipherText, encryptorEncryptionKey);
}
public String decrypt(String cipherText, String encryptionKey) {
String plainText = null;
try {
cipher = Cipher.getInstance(CIPHER_INSTANCE);
GCMParameterSpec params = new GCMParameterSpec(GCM_AUTHENTICATION_TAG_SIZE * Byte.SIZE, encryptionKey.getBytes(), 0, 12);
cipher.init(Cipher.DECRYPT_MODE, key, params);
byte[] bytes = Base64.getDecoder().decode(cipherText);
byte[] decrypted = cipher.doFinal(bytes);
plainText = new String(decrypted, "UTF8");
} catch (Exception e) {
logger.warn(e.getMessage());
}
return plainText;
}
public boolean isEncoded(String cipherText) {
boolean encoded = false;
if (cipherText != null && !cipherText.trim().isEmpty()) {
try {
GCMParameterSpec params = new GCMParameterSpec(GCM_AUTHENTICATION_TAG_SIZE * Byte.SIZE, encryptorEncryptionKey.getBytes(), 0, 12);
cipher.init(Cipher.DECRYPT_MODE, key, params);
byte[] bytes = Base64.getDecoder().decode(cipherText);
cipher.doFinal(bytes);
encoded = true;
} catch (Throwable e) {
// handle exception
}
}
return encoded;
}
}
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:
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Base64;
import javax.annotation.PostConstruct;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class EncryptorBean {
private Logger logger = LoggerFactory.getLogger(EncryptorBean.class);
@Value("${security.encryptor.encryption-key}")
private String encryptorEncryptionKey;
@Value("${security.encryptor.salt}")
private String encryptorSalt;
@Value("${security.encryptor.password}")
private String encryptorPassword;
private static final int KEY_LENGTH = 256;
private static final String ALGORITHM = "AES";
private static final int ITERATION_COUNT = 65536;
private static final String PBE_ALGORITHM = "PBEWithHmacSHA256AndAES_128";
private static final String CIPHER_INSTANCE = "AES_256/GCM/NOPADDING";
private static final int GCM_AUTHENTICATION_TAG_SIZE = 16;
// the key
private transient SecretKey key;
Cipher cipher;
/**
* Post construct to creates secret key. In production we may want to avoid keeping the secret key hanging around in memory for very long.
*/
@PostConstruct
public void postConstruct() {
try {
// create the PBE key
KeySpec spec = new PBEKeySpec(encryptorPassword.toCharArray(), encryptorSalt.getBytes(), ITERATION_COUNT, KEY_LENGTH);
SecretKey skey = SecretKeyFactory.getInstance(PBE_ALGORITHM).generateSecret(spec);
// recast key as straightforward AES without padding.
key = new SecretKeySpec(skey.getEncoded(), ALGORITHM);
} catch (SecurityException | InvalidKeySpecException | NoSuchAlgorithmException ex) {
// handle appropriately...
ex.printStackTrace();
}
}
/**
* Encrypt String
*/
public String encrypt(String plainText) {
return encrypt(plainText, encryptorEncryptionKey);
}
public String encrypt(String plainText, String encryptionKey) {
String cipherText = null;
try {
cipher = Cipher.getInstance(CIPHER_INSTANCE); // we must use it here to avoid java.security.InvalidAlgorithmParameterException: Cannot reuse iv for GCM encryption
GCMParameterSpec params = new GCMParameterSpec(GCM_AUTHENTICATION_TAG_SIZE * Byte.SIZE, encryptionKey.getBytes(), 0, 12);
cipher.init(Cipher.ENCRYPT_MODE, key, params);
byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
cipherText = Base64.getEncoder().withoutPadding().encodeToString(encrypted);
} catch (Exception e) {
logger.warn(e.getMessage());
}
return cipherText;
}
/**
* Decrypt String
*/
public String decrypt(String cipherText) {
return decrypt(cipherText, encryptorEncryptionKey);
}
public String decrypt(String cipherText, String encryptionKey) {
String plainText = null;
try {
cipher = Cipher.getInstance(CIPHER_INSTANCE); // we must use it here to avoid java.security.InvalidAlgorithmParameterException: Cannot reuse iv for GCM encryption
GCMParameterSpec params = new GCMParameterSpec(GCM_AUTHENTICATION_TAG_SIZE * Byte.SIZE, encryptionKey.getBytes(), 0, 12);
cipher.init(Cipher.DECRYPT_MODE, key, params);
byte[] bytes = Base64.getDecoder().decode(cipherText);
byte[] decrypted = cipher.doFinal(bytes);
plainText = new String(decrypted, "UTF8");
} catch (Exception e) {
logger.warn(e.getMessage());
}
return plainText;
}
public boolean isEncoded(String cipherText) {
boolean encoded = false;
if (cipherText != null && !cipherText.trim().isEmpty()) {
try {
GCMParameterSpec params = new GCMParameterSpec(GCM_AUTHENTICATION_TAG_SIZE * Byte.SIZE, encryptorEncryptionKey.getBytes(), 0, 12);
cipher.init(Cipher.DECRYPT_MODE, key, params);
byte[] bytes = Base64.getDecoder().decode(cipherText);
cipher.doFinal(bytes);
encoded = true;
} catch (Throwable e) {
// handle exception. Perhaps set value to null?
// e.printStackTrace();
}
}
return encoded;
}
}
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:
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Last unit does not have enough valid bits
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 5f
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 2e
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 24
WARN 1 --- [nio-8080-exec-1] xxx.xxx.xxx.EncryptorBean : Illegal base64 character 40
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?
专注分享java语言的经验与见解,让所有开发者获益!
评论