基于 Java 加密快速入门(Base64、MD5、AES)

参考的文献

Base 64 百度百科

MD5 百度百科

AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】

AES 百度百科

AES加密 - iOS与Java的同步实现

Base64

简介

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。

示例

明文 转换方式 密文
你好! Base64 5L2g5aW977yB

转换原理

转码过程例子:
3*8=4*6
内存1个字节占8位
转前: s 1 3
先转成ascii:对应 115 49 51
2进制: 01110011 00110001 00110011
6个一组(4组) 011100110011000100110011
然后才有后面的 011100 110011 000100 110011
然后计算机是8位8位的存数 6不够,自动就补两个高位0了
所有有了 高位补0
科学计算器输入 00011100 00110011 00000100 00110011
得到 28 51 4 51
查对下照表 c z E z

基于 Java 的实现

其实在 java 1.8 ,Base 64 已被置入 java util 包下,在这之后做 Base64 转换不再需要依赖外部 jar

import java.util.Base64;


    /**
     * 将目标 Base64 化
     *
     * @param targetString 目标参数
     * @return 目标参数 Base64 编码后的值
     */
    public static String encodeBase64(byte[] targetString) {
        Base64.Encoder encoder_Default = Base64.getEncoder();
        String result = encoder_Default.encodeToString(targetString);
        return result;
    }


    /**
     * 将目标反 Base64 化
     *
     * @param targetString 目标参数
     * @return 目标参数反 Base64 编码后的值
     */
    public static String decodeBase64(String targetString) {
     Base64.Decoder decoder_Default = Base64.getDecoder();
        String result = null;
        try {
            byte[] result_temp = decoder_Default.decode(targetString.getBytes("utf-8"));
            result = new String(result_temp);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return result;
    }

必要的说明

与 MD5、AES不同,Base 64 严格来说不属于加密,而是一种编码形式。在介绍加密之前首先得了解一些基本概念。另:从加密开始原理就已经不是简单几句能讲明白的了,故下文不再说明,本文顶部有传送门,自行酌情深入研究。

对称加密与非对称加密

传送门:对称加密和非对称加密介绍和区别

MD5

简介

非对称加密

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。引用块内容

示例

明文 转换方式 密文
哈喽~ MD5 & Hex 61C5910F49B8FE5A4F9D59F9E80E89BF

基于 Java 的实现

private static final char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};


    public static byte[] sign_MD5(String targetString) {
        byte[] result = null;
        try {
            MessageDigest generator_MD5 = MessageDigest.getInstance("MD5");
            generator_MD5.update(targetString.getBytes("utf-8"));
            result = generator_MD5.digest();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return result;
    }

 private static String byteToHexString(byte[] target) {
        String result = null;
        int dataLength = target.length;
        char resultTemp[] = new char[dataLength * 2];
        try {
            int k = 0;
            for (int i = 0; i < dataLength; i++) {
                byte byte0 = target[i];
                resultTemp[k++] = hexDigits[byte0 >>> 4 & 0xf];
                resultTemp[k++] = hexDigits[byte0 & 0xf];
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        result = new String(resultTemp);
        return result;
    }

AES

简介

对称加密

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

示例

明文 转换方式 密文
AAA 密钥 1111 填充方式 PKCS5Padding 加密模式 ECB L9ktI5YPac6YmNvXbab68A==

基于 Java 的实现

public static String encryptAES(String content, String key) 
            throws InvalidKeyException, NoSuchAlgorithmException, 
            NoSuchPaddingException, UnsupportedEncodingException, 
            InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {

    byte[] byteContent = content.getBytes("UTF-8");

    // 注意,为了能与 iOS 统一
    // 这里的 key 不可以使用 KeyGenerator、SecureRandom、SecretKey 生成
    byte[] enCodeFormat = key.getBytes();
    SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, "AES");

    byte[] initParam = IV_STRING.getBytes();
    IvParameterSpec ivParameterSpec = new IvParameterSpec(initParam);

    // 指定加密的算法、工作模式和填充方式
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);

    byte[] encryptedBytes = cipher.doFinal(byteContent);

    // 同样对加密后数据进行 base64 编码
    Encoder encoder = Base64.getEncoder();
    return encoder.encodeToString(encryptedBytes);
}

你可能感兴趣的:(JavaWeb后端)