Java的加密与安全

编码算法

URL 编码

目的:
  在使用 URL 向服务器发送数据时,由于很多服务器只能识别 ASCII 字符,但如果URL中包含中文、日文这些非 ASCII 字符时,就需要对其编码后,再发送给服务器。

Base64 编码

完成的功能:
  Base64 编码是对二进制数据进行编码,表示成文本格式,即服务器通用的(字母、数字、+、/、=) 字符,也由于该特性,Base64 编码后,数据长度增加 1/3 。

  在项目中,将报文进行压缩、加密后,最后一步必然是使用 Base64 编码,因为 Base64 编码的字符串,更适合不同平台、不同语言的传输。

Java用例:

		String src="abc^???-)";
        String encode = Base64.getEncoder().encodeToString(src.getBytes("utf-8"));
        System.out.println(encode);     //YWJjXj8/Py0p

        byte[] decode = Base64.getDecoder().decode(encode);
        String decodeSrc = new String(decode);
        System.out.println(decodeSrc);  //abc^???-)

对称加密算法

  对称加密,是为了解决数据传输过程中,被第三方窃取的问题。发送方通过约定的密钥加密,接收方接受到密文后,使用密钥解密便得到明文。

  在整个过程中,密钥的安全性,显的比较重要。密钥的确定有两种方式,一是发送、接受方提前约定好,配置在代码中,二是通过传输临时约定密钥,该种方式需要考虑中间人攻击的情况。

常用的对称加密算法:

算法 密钥长度 工作模式 填充模式
DES 56/64 ECB/CBC/PCBC/CTR/… NoPadding/PKCS5Padding/…
AES 128/192/256 ECB/CBC/PCBC/CTR/… NoPadding/PKCS5Padding/PKCS7Padding/…
IDEA 128 ECB PKCS5Padding/PKCS7Padding/…

DES短时间内可被破解,故不再推荐使用

提前约定密钥的 AES 对称加密

  从上述的表格中可以看到,aes 的密钥可以为三种固定的长度,16、24、32个字符的字符串,其余长度的密钥均会被各种语言平台处理为对应的长度。

   AES/ECB/PKCS5Padding 加密用例:

import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class AES {

    public static void main(String[] args) {
        String key="1234567890123456";
        try {
            String encrypt = encrypt("abccccccccabc", key);
            System.out.println(encrypt);//16:EiiaUaAym+SZW2mhCchsHw==   24:D2Hdlvx19upLOQHjr9j8WQ==  32

            String decrypt = decrypt(encrypt, key);
            System.out.println(decrypt);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 加密
    public static String encrypt(String sSrc, String sKey) throws Exception {
        if (sKey == null) {
            System.out.print("Key为空null");
            return null;
        }

        SecretKeySpec skeySpec = new SecretKeySpec(sKey.getBytes("utf-8"), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");//"算法/模式/补码方式"
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8"));

        return Base64.encodeBase64String(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
    }

    //解密
    public static String decrypt(String sSrc, String sKey) throws Exception {
        // 判断Key是否正确
        if (sKey == null) {
            System.out.print("Key为空null");
            return null;
        }
        SecretKeySpec skeySpec = new SecretKeySpec(sKey.getBytes("utf-8"), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);

        byte[] encrypted1 = Base64.decodeBase64(sSrc);//先用base64解密
        byte[] original = cipher.doFinal(encrypted1);//再用aes解密
        String originalString = new String(original, "utf-8");
        return originalString;
    }
}

在线加解密工具
  

你可能感兴趣的:(Java-SE)