JAVA加密系列(一)-Base64与单向加密算法MD5、SHA

2019-07-29  本文已影响0人  lance_小超

JAVA加密系列(一)-Base64与单向加密算法MD5、SHA、HMAC

Base64

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法,严格的来说base64属于编码格式并非加密算法,但是因为base64是二进制数据可以和很多的加密算法配合产生化学反应,学加密前先了解清楚base64的原理,实质上应用场景非常广泛,很容易掌握,不懂原理的可以看什么是base64

单向加密

单向加密又称为不可逆加密算法,在加密过程中不使用密钥,明文由系统加密处理成密文,密文无法解密。一般适合于验证,在验证过程中,重新输入明文,并经过同样的加密算法处理,得到相同的密文并被系统重新认证。广泛使用于口令加密。

加密解析

Base64

源码解析

public static void main(String[] args) {
        //字符串编码
        System.out.println("编码结果:"+encrypt("hello world"));
        //字符串解码
        System.out.println("编码结果:"+decrypt("aGVsbG8gd29yZA=="));
    }

    public static String encrypt(String str){
        byte[] bytes=str.getBytes();
        bytes=Base64.getEncoder().encode(bytes);
        return new String(bytes);
    }

    public static String decrypt(String str){
        byte[] bytes=str.getBytes();
        bytes=Base64.getDecoder().decode(bytes);
        return new String(bytes);
    }
    
    log
    编码结果:aGVsbG8gd29yZA==
    编码结果:hello word

MD5

源码解析

public static void main(String[] args) {
        //字符串编码
        System.out.println("编码结果:"+encryptMD5("hello world"));

    }

    public static String encryptMD5(String str){
        try {
            byte[] bytes=str.getBytes();
            MessageDigest messageDigest=MessageDigest.getInstance("MD5");
            messageDigest.update(bytes);
            bytes = messageDigest.digest();

            // digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
            // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
            //一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方)
            return new BigInteger(1, bytes).toString(16);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }
    
    log 
    编码结果:13574ef0d58b50fab38ec841efe39df4

SHA

源码解析

public static void main(String[] args) {
        //字符串编码
        System.out.println("编码结果:"+encrypt("hello world"));

    }

    public static String encrypt(String str){
        try {
            byte[] bytes=str.getBytes();
            MessageDigest messageDigest=MessageDigest.getInstance("SHA");
            messageDigest.update(bytes);
            bytes = messageDigest.digest();

            // digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
            // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
            //一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方)
            return new BigInteger(1, bytes).toString(16);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }
    
    log
    编码结果:e0738b87e67bbfc9c5b77556665064446430e81c

HMAC

public static void main(String[] args) {
        //字符串编码
        System.out.println("编码结果:"+encrypt("hello world"));

    }

    public static String encrypt(String str){
        try {
            byte[] bytes=str.getBytes();
            SecretKey secretKey=new SecretKeySpec(bytes,"HmacMD5");
            Mac mac=Mac.getInstance(secretKey.getAlgorithm());
            mac.init(secretKey);
            bytes=mac.doFinal(bytes);
            // digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
            // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
            //一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方)
            return new BigInteger(1, bytes).toString(16);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    log 
    编码结果:4b003eb6cb233122bb5a94ff468b95b7
    

源码下载

GitHub,感兴趣的点个星星

详情文章

总结

单向加密应用非常广泛,比较常用的用途是校验数据或者文件在传输过程中是否修改,以上例子均展示的最简单的实例,因为都是基于byte数据进行操作,那么完全可以使用base64以及位运算进行操作加大安全性,具体实现方式请查看后续文章

上一篇 下一篇

猜你喜欢

热点阅读