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

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

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?

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:

确定