Base64Utils
import com.myblog.utils.StringUtil;
import java.io.*;
import java.util.Base64;
public class Base64Utils {
private static final int BASELENGTH = 128;
private static final int LOOKUPLENGTH = 64;
private static final int TWENTYFOURBITGROUP = 24;
private static final int EIGHTBIT = 8;
private static final int SIXTEENBIT = 16;
private static final int FOURBYTE = 4;
private static final int SIGN = -128;
private static final char PAD = '=';
private static byte[] base64Alphabet = new byte[BASELENGTH];
private static char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH];
private static final int FILE_SIZE = 1024;
static {
for (int i = 0; i < BASELENGTH; i++) {
base64Alphabet[i] = -1;
}
for (int i = 'Z'; i >= 'A'; i--) {
base64Alphabet[i] = (byte)(i - 'A');
}
for (int i = 'z'; i >= 'a'; i--) {
base64Alphabet[i] = (byte)(i - 'a' + 26);
}
for (int i = '9'; i >= '0'; i--) {
base64Alphabet[i] = (byte)(i - '0' + 52);
}
base64Alphabet['+'] = 62;
base64Alphabet['/'] = 63;
for (int i = 0; i <= 25; i++) {
lookUpBase64Alphabet[i] = (char)('A' + i);
}
for (int i = 26, j = 0; i <= 51 ; i++, j++) {
lookUpBase64Alphabet[i] = (char)('a' + j);
}
for (int i = 52, j = 0; i <= 61; i++, j++) {
lookUpBase64Alphabet[i] = (char)('0' + j);
}
lookUpBase64Alphabet[62] = '+';
lookUpBase64Alphabet[63] = '-';
}
public static boolean isWhiteSpace(char oct){
return oct == 0x20 || oct == 0xd || oct == 0xa || oct == 0x9;
}
public static boolean isPad(char oct) {
return oct == PAD;
}
public static boolean isData(char oct){
return oct < BASELENGTH && base64Alphabet[oct] != -1;
}
public static boolean isBase(String data){
return isArrayBase64(data.getBytes());
}
public static boolean isBase(byte data){
return data == PAD || base64Alphabet[data] != -1;
}
public static boolean isArrayBase64(byte[] data){
int len = data.length;
if(len == 0){
return true;
}
for (int i = 0; i < len; i++) {
if(!isBase(data[i])){
return false;
}
}
return true;
}
public static String encode(byte[] binaryData)
{
if (binaryData == null)
{
return null;
}
int lengthDataBits = binaryData.length * EIGHTBIT;
if (lengthDataBits == 0)
{
return "";
}
int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets;
char encodedData[] = null;
encodedData = new char[numberQuartet * 4];
byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;
int encodedIndex = 0;
int dataIndex = 0;
for (int i = 0; i < numberTriplets; i++)
{
b1 = binaryData[dataIndex++];
b2 = binaryData[dataIndex++];
b3 = binaryData[dataIndex++];
l = (byte) (b2 & 0x0f);
k = (byte) (b1 & 0x03);
byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc);
encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3];
encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f];
}
if (fewerThan24bits == EIGHTBIT)
{
b1 = binaryData[dataIndex];
k = (byte) (b1 & 0x03);
byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4];
encodedData[encodedIndex++] = PAD;
encodedData[encodedIndex++] = PAD;
}
else if (fewerThan24bits == SIXTEENBIT)
{
b1 = binaryData[dataIndex];
b2 = binaryData[dataIndex + 1];
l = (byte) (b2 & 0x0f);
k = (byte) (b1 & 0x03);
byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0);
byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0);
encodedData[encodedIndex++] = lookUpBase64Alphabet[val1];
encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)];
encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2];
encodedData[encodedIndex++] = PAD;
}
return new String(encodedData);
}
public static String decode(String str, String charset) throws UnsupportedEncodingException {
String result = null;
if(!StringUtil.isEmpty(str)){
byte[] bytes = decode(str);
if(bytes != null && bytes.length > 0){
result = new String(bytes, charset);
}
}
return result;
}
public static byte[] decode(String encoded)
{
if (encoded == null)
{
return null;
}
char[] base64Data = encoded.toCharArray();
int len = removeWhiteSpace(base64Data);
if (len % FOURBYTE != 0)
{
return null;
}
int numberQuadruple = (len / FOURBYTE);
if (numberQuadruple == 0)
{
return new byte[0];
}
byte decodedData[] = null;
byte b1 = 0, b2 = 0, b3 = 0, b4 = 0;
char d1 = 0, d2 = 0, d3 = 0, d4 = 0;
int i = 0;
int encodedIndex = 0;
int dataIndex = 0;
decodedData = new byte[(numberQuadruple) * 3];
for (; i < numberQuadruple - 1; i++)
{
if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))
|| !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++])))
{
return null;
}
b1 = base64Alphabet[d1];
b2 = base64Alphabet[d2];
b3 = base64Alphabet[d3];
b4 = base64Alphabet[d4];
decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
}
if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++])))
{
return null;
}
b1 = base64Alphabet[d1];
b2 = base64Alphabet[d2];
d3 = base64Data[dataIndex++];
d4 = base64Data[dataIndex++];
if (!isData((d3)) || !isData((d4)))
{
if (isPad(d3) && isPad(d4))
{
if ((b2 & 0xf) != 0)
{
return null;
}
byte[] tmp = new byte[i * 3 + 1];
System.arraycopy(decodedData, 0, tmp, 0, i * 3);
tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
return tmp;
}
else if (!isPad(d3) && isPad(d4))
{
b3 = base64Alphabet[d3];
if ((b3 & 0x3) != 0)
{
return null;
}
byte[] tmp = new byte[i * 3 + 2];
System.arraycopy(decodedData, 0, tmp, 0, i * 3);
tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
return tmp;
}
else
{
return null;
}
}
else
{
b3 = base64Alphabet[d3];
b4 = base64Alphabet[d4];
decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4);
decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf));
decodedData[encodedIndex++] = (byte) (b3 << 6 | b4);
}
return decodedData;
}
private static int removeWhiteSpace(char[] data) {
if (data == null)
{
return 0;
}
int newSize = 0;
int len = data.length;
for (int i = 0; i < len; i++)
{
if (!isWhiteSpace(data[i]))
{
data[newSize++] = data[i];
}
}
return newSize;
}
public static byte[] fileToByte(String path) throws IOException {
byte[] data = new byte[0];
File file = new File(path);
if(file.exists()){
FileInputStream inputStream = new FileInputStream(file);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(2048);
byte[] cache = new byte[FILE_SIZE];
int read = 0;
while ((read = inputStream.read(cache)) != -1){
outputStream.write(cache, 0, read);
outputStream.flush();
}
inputStream.close();
outputStream.close();
data = outputStream.toByteArray();
}
return data;
}
public static void ByteToFile(byte[] bytes, String path) throws IOException {
InputStream inputStream = new ByteArrayInputStream(bytes);
File file = new File(path);
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
file.createNewFile();
OutputStream outputStream = new FileOutputStream(file);
byte[] cache = new byte[FILE_SIZE];
int read = 0;
while ((read = inputStream.read(cache)) != -1){
outputStream.write(cache, 0, read);
outputStream.flush();
}
inputStream.close();
outputStream.close();
}
public static String encodeFile(String path) throws IOException {
byte[] data = fileToByte(path);
return encode(data);
}
public static void decodeFile(String path, String base) throws IOException {
byte[] base64 = decode(base);
ByteToFile(base64, path);
}
}
MD5Utils
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils{
private static Logger logger = LoggerFactory.getLogger(MD5Utils.class);
private static MessageDigest digest = null;
private byte[] salt;
private int position;
public MD5Utils(){
this.salt = null;
this.position = -1;
}
public MD5Utils(byte[] salt, int position){
this.salt = salt;
this.position = position;
}
private static void init(){
try {
digest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
logger.debug("MD5加密日志实现的错误日志 ====>>" + e.getMessage(), e);
}
}
private static String decodeStr(byte[] ...datas){
StringBuffer buffer = new StringBuffer();
for (byte[] data: datas) {
int len = data.length;
for (int i = 0; i < len; i++) {
int val = ((int) data[i]) & 0xff;
if(val < 16){
buffer.append("0");
}
buffer.append(Integer.toHexString(val));
}
}
return new String(buffer);
}
public byte[] encode(byte[] data){
byte[] result = new byte[0];
String str = "";
init();
if(this.position == 0){
result = doDigest(this.salt, data);
} else if(this.position >= data.length){
result = doDigest(data, this.salt);
} else if(this.salt != null && this.salt.length > 0){
digest.update(data, 0, this.position);
digest.update(this.salt);
digest.update(data, this.position, data.length - this.position);
result = digest.digest();
} else if(this.position < 0){
result = doDigest(data);
}
str = decodeStr(result);
return str.getBytes();
}
private static byte[] doDigest(byte[] ...datas){
for (byte[] data: datas) {
if(data != null){
digest.update(data);
}
}
return digest.digest();
}
}
整合Base64和MD5
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SecretUtils {
private static final Logger log = LoggerFactory.getLogger(SecretUtils.class);
public static String encodeBase64(String data){
String result = Base64Utils.encode(data.getBytes());
log.debug("自定义Base64编码加密的32位秘钥的调试日志 ====>>"+ result);
return result;
}
public static String encodeMD5(String data, String salt, int position){
MD5Utils utils = new MD5Utils(salt.getBytes(), position);
byte[] result = utils.encode(data.getBytes());
String str = new String(result);
log.debug("自定义MD5加密盐值的32位密钥的调试日志 ====>>" + str);
return str;
}
public static String Base64AndMD5(String data, String salt, int position){
String result = Base64Utils.encode(data.getBytes());
MD5Utils utils = new MD5Utils(salt.getBytes(), position);
byte[] getData = utils.encode(result.getBytes());
String str = new String(getData);
log.debug("先Base64编码后再执行MD5加密盐值的32位密钥的调试日志 ====>>" + str);
return str;
}
public static String MD5AndBase64(String data, String salt, int position){
MD5Utils utils = new MD5Utils(salt.getBytes(), position);
byte[] result = utils.encode(data.getBytes());
String str = Base64Utils.encode(result);
log.debug("先执行MD5加密盐值后再Base64编码的32位密钥的调试日志 ====>>" + str);
return str;
}
public static String MD5WithSaltPosition(String data){
MD5Utils utils = new MD5Utils();
byte[] result = utils.encode(data.getBytes());
String str = new String(result);
log.debug("自定义MD5加密不加盐值的32位密钥的调试日志 ====>>" + str);
return str;
}
}