java的加密方式

本文详细介绍了Java中的加密技术,包括Base64编码,单向加密如MD5、SHA和HMAC,以及对称加密的DES和AES,最后讨论了非对称加密的RSA和ECC。这些技术广泛应用于数据安全、文件校验和网络通信中。
摘要由CSDN通过智能技术生成

一、Base64

介绍

对称加密。其实是一种编码格式,而非加密算法。

会将8位的非英语字符转化为7位的ASCII字符。Base64编码后的文本,会比原文本大出三分之一左右。BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充

java实现

早期实现:

BASE64Encoder encoder = new BASE64Encoder();
BASE64Decoder decoder = new BASE64Decoder();
String text = "字串文字";
byte[] textByte = text.getBytes("UTF-8");
//编码
String encodedText = encoder.encode(textByte);
System.out.println(encodedText);
//解码
System.out.println(new String(decoder.decodeBuffer(encodedText), "UTF-8"));

Apache Commons Codec实现:

Base64 base64 = new Base64();
String text = "字串文字";
byte[] textByte = text.getBytes("UTF-8");
//编码
String encodedText = base64.encodeToString(textByte);
System.out.println(encodedText);
//解码
System.out.println(new String(base64.decode(encodedText), "UTF-8"));

java8实现:

Base64.Decoder decoder = Base64.getDecoder();
Base64.Encoder encoder = Base64.getEncoder();
String text = "字串文字";
byte[] textByte = text.getBytes("UTF-8");
//编码
String encodedText = encoder.encodeToString(textByte);
System.out.println(encodedText);
//解码
System.out.println(new String(decoder.decode(encodedText), "UTF-8"));

Java 8提供的Base64拥有更好的效能。

用途

常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。

二、单向加密

介绍

又称为不可逆加密算法,在加密过程中不使用密钥,明文由系统加密处理成密文,密文无法解密。

MD5(Message Digest algorithm 5,信息摘要算法)
介绍

用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。

实现

Java实现 1 (新版本的jar包已失效):

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.13</version>
</dependency>
import org.apache.commons.codec.binary.Hex;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
     * 将数据进行 MD5 加密,并以16进制字符串格式输出
     * @param data
     * @return
     */
    public static String md5(String data) {
   
        try {
   
            MessageDigest md = MessageDigest.getInstance("MD5");
            return Hex.encodeHexString(md.digest(data.getBytes(StandardCharsets.UTF_8)));
        } catch (NoSuchAlgorithmException e) {
   
            e.printStackTrace();
        }
        return "";
    }

    public static void main(String[] args) {
   
        String password = "password";
        String md5HexStr = md5(password);
        System.out.println("==> MD5 加密前: " + password);
        System.out.println("==> MD5 加密后: " + md5HexStr);
    }

实现 2

private static String MD5encode(String password) {
   
		try {
   
			//得到一个信息摘要器
			MessageDigest digest = MessageDigest.getInstance("md5");
			byte[] result = digest.digest(password.getBytes());
			StringBuffer buffer = new StringBuffer();
			//把每一个byte做一个与运算0xff
			for(byte b:result) {
   
				int number = b & 0xff;
				String str = Integer.toHexString(number);
				if(str.length() == 1) {
   
					buffer.append("0");
				}
				buffer.append(str);
			}
			//标准的MD5加密后的结果
			return buffer.toString().toUpperCase();
		} catch (NoSuchAlgorithmException e) {
   
			e.printStackTrace();
			return "";
		}
	}
用途

常用于文件校验。不管文件多大,经过MD5后都能生成唯一的MD5值

SHA(Secure Hash Algorithm,安全散列算法)
介绍

对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。

实现
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
 
public class SHA256Utils {
   
 
	/**
	* 利用java原生的摘要实现SHA256加密
	* @param str 加密后的报文
	* @return
	*/
	public static String getSHA256StrJava(String str){
   
		MessageDigest messageDigest;
		String encodeStr = "";
		try {
   
			messageDigest = MessageDigest.getInstance("SHA-256");
			messageDigest.update(str.getBytes("UTF-8"));
			encodeStr = byte2Hex(messageDigest.digest());
		} catch (NoSuchAlgorithmException e) {
   
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
   
			e.printStackTrace();
		}
		return encodeStr;
	}
 
	/**
	* 将byte转为16进制
	* @param bytes
	* @return
	*/
	private static String byte2Hex(byte[] bytes){
   
		StringBuffer stringBuffer = new StringBuffer();
		String temp = null;
		for (int i=0;i<bytes.length;i++){
   
			temp = Integer.toHexString(bytes[i] & 0xFF);
			if (temp.length()==1){
   
				//1得到一位的进行补0操作
				stringBuffer.append("0");
			}
			stringBuffer.append(temp);
		}
		return stringBuffer.toString();
	}
}
用途

主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。

HMAC(Hash Message Authentication Code,散列消息鉴别码)
介绍

基于密钥的Hash算法的认证协议。原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。

分类
算法种类 摘要长度
HmacMD5 128
HmacSHA1 160
HmacSHA256 256
HmacSHA384 384
HmacSHA512 512
实现

JDK实现

package HMAC;

/**
 * @description:
 * @author: lv
 * @time: 2020/8/8 11:23
 */
import java.nio.charset.Charset;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class JdkHmacUtils {
   

    // 获取 HmacMD5 Key
    public static byte[] getHmacMd5Key() {
   
        return getHmacKey("HmacMD5");
    }

    // 获取 HmacSHA256
    public static byte[] getHmacSha256Key() {
   
        return getHmacKey("HmacSHA256");
    }

    // 获取 HmacSHA512
    public static byte[] getHmacSha512Key() {
   
        return getHmacKey("HmacSHA512");
    }

    // 获取 HMAC Key
    public
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值