Java 常见编码和加密方案

admin 2月前 1359

Base64

Java 8之后在java.util包中便集成了,Base64编码和解码,支持UrlEncode 和 UrlDecode,与sun.mis c套件和Apache Commons Codec所提供的Base64编解码器来比较的话,Java 8提供的Base64拥有更好的效能。

//编码
Base64.getEncoder().encodeToString("测试".getBytes(StandardCharsets.UTF_8));
//编码
new String(Base64.getEncoder().encode("测试".getBytes(StandardCharsets.UTF_8)));
//解码
new String(Base64.getDecoder().decode("5rWL6K+V5YaF5a65"), StandardCharsets.UTF_8);
//Url编码
Base64.getUrlEncoder().encodeToString("https://www.4gml.com".getBytes(StandardCharsets.UTF_8));
//Url解码
new String(Base64.getUrlDecoder().decode("5rWL6K+aHR0cHM6Ly93d3cuNGdtbC5jb20="),StandardCharsets.UTF_8);

MD5

介绍

MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据运算为另一固定长度值。MD5加密是不可逆的,所以除了暴力破解一般逆序算法是得不到结果的。

特点

  1. 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
  2. 容易计算:从原数据计算出MD5值很容易。
  3. 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
  4. 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据是非常困难的。

使用

一:使用spring框架自带的DigestUtils

DigestUtils.md5DigestAsHex(str.getBytes());//str为待加密的字符串

二:使用java.security.MessageDigest

    public  String Md5(String str) {
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            byte[] digest = md5.digest(str.getBytes());
            char[] chars = new char[] { '0', '1', '2', '3', '4', '5', '6', '7' , '8', '9', 'A', 'B', 'C', 'D', 'E','F' };
            StringBuffer sb = new StringBuffer();
            // 处理成十六进制的字符串(通常)
            for (byte bb : digest) {
                sb.append(chars[(bb >> 4) & 15]);
                sb.append(chars[bb & 15]);
            }
            return new String(sb);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }

PBE

PBE:Password Based Encryption 基于口令加密。通过加Salt来增强安全性。结合了消息摘要算法和对称加密算法的优点!

public class PbeUtil {
//可以使用byte[] salt = new SecureRandom().generateSeed(8);获取salt

    public static String PbeEncrypt(String str,String password,String salt){
        try {
            PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
            Key key = factory.generateSecret(pbeKeySpec);
            //加密
            PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt.getBytes(StandardCharsets.UTF_8), 100);
            Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
            cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpec);
            byte[] result = cipher.doFinal(str.getBytes(StandardCharsets.UTF_8));
            return new String(Base64.getEncoder().encode(result));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String PbeDecrypt(String str,String password,String salt) {
        try {
            PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
            Key key = factory.generateSecret(pbeKeySpec);
            PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt.getBytes(StandardCharsets.UTF_8), 100);
            Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
            //解密
            cipher.init(Cipher.DECRYPT_MODE, key, pbeParameterSpec);
            return new String(cipher.doFinal(Base64.getDecoder().decode(str.getBytes(StandardCharsets.UTF_8))));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

AES

public class Crypt {
    private static final String ALGORITHM = "AES";
    private static final String ALGORITHM_STR = "AES/ECB/PKCS5Padding";
    private SecretKeySpec key;

    public Crypt(String hexKey) {
        key = new SecretKeySpec(hexKey.getBytes(), ALGORITHM);
    }

    /**
     * AES加密
     */
    public String encryptData(String data){
        try {
            Cipher cipher = Cipher.getInstance(ALGORITHM_STR);
            cipher.init(Cipher.ENCRYPT_MODE, key);
            return new String(Base64.getEncoder().encode(cipher.doFinal(data.getBytes(StandardCharsets.UTF_8))));
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | BadPaddingException | IllegalBlockSizeException | InvalidKeyException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * AES解密
     */
    public String decryptData(String base64Data){
        try {
            Cipher cipher = Cipher.getInstance(ALGORITHM_STR);
            cipher.init(Cipher.DECRYPT_MODE, key);
            return new String(cipher.doFinal(Base64.getDecoder().decode(base64Data)));
        } catch (NoSuchAlgorithmException | NoSuchPaddingException | BadPaddingException | IllegalBlockSizeException | InvalidKeyException e) {
            e.printStackTrace();
        }
        return null;
    }

}

hmacSHA256

public class HmacUtil {
    public static String hmacSHA256(String key,String content) throws Exception {
        Mac hmacSha256 = Mac.getInstance("HmacSHA256");
        hmacSha256.init(new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), 0, key.length(), "HmacSHA256"));
        byte[] hmacSha256Bytes = hmacSha256.doFinal(content.getBytes(StandardCharsets.UTF_8));
        return new String(hmacSha256Bytes);
    }
}
最后于 10天前 被admin编辑 ,原因:
最新回复 (0)
全部楼主
返回
发新帖