Java 的 Base64、消息摘要算法加密

Java 的 Base64、消息摘要算法加密

常用术语

  • 明文:待加密信息
  • 密文:经过加密后的明文
  • 加密:明文转为密文的过程
  • 加密算法:明文转为密文的转换算法
  • 加密密钥:通过加密算法进行加密操作的密钥
  • 解密:密文转为明文的过程
  • 解密算法:密文转为明文的转换算法
  • 解密密钥:通过解密算法进行解密操作的密钥
  • 柯克霍夫原则:数据的安全基于密钥而不是算法的保密

密码分类

名称别名详细说明
对称密码单钥密码或私钥密码指加密密钥与解密密钥相同
非对称密码双钥密码或公钥密码指加密密钥与解密密钥不同,密钥分公钥、私钥

Base64 算法

  • 明文:Hello LeifChen
  • Base64 密文:SGVsbG8gTGVpZkNoZW4=

1 JDK 实现 Base64

import sun.misc.BASE64Encoder;

public class Base64Utils {
    public static String jdkBase64(String str) {
        return new BASE64Encoder().encode(str.getBytes());
    }
}

2 Commons Codec 实现 Base64

  • 引入依赖
    implementation 'commons-codec:commons-codec:1.11'
import org.apache.commons.codec.binary.Base64;

public class Base64Utils {
    public static String commonsCodecBase64(String str) {
        return new String(Base64.encodeBase64(str.getBytes()));
    }
}    

3 Bouncy Castle 实现 Base64

  • 引入依赖
    implementation 'org.bouncycastle:bcprov-jdk15on:1.60'
import org.bouncycastle.util.encoders.Base64;

public class Base64Utils {
    public static String bouncyCastleBase64(String str) {
        return new String(Base64.encode(str.getBytes()));
    }
}

消息摘要算法

  • 明文:Hello LeifChen
  • MD5 密文:7a0b5a39272461d7ddfb6bc26be03225
  • SHA-1 密文:3a0f53933e985d95fc72ab913f1aa267231ee7eb
  • SHA-224 密文:499d695fd99fc87f40a3b4c53dcc29627c86d5983345ec482b1ffc5b
  • HmacMD5 密文(key = “aa”):e192f1b893eacc32247cdaeb9a5bbe9c

1 MD(Message Digest)

算法摘要长度实现方
MD2128JDK
MD4128Bouncy Castle
MD5128JDK
  • MD 应用
    MD
1.1 JDK 实现 MD5
import org.apache.commons.codec.binary.Hex;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MessageDigestUtils {
    public static String jdkMD5(String str) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            return Hex.encodeHexString(md.digest(str.getBytes()));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
1.2 Commons Codec 实现 MD5
import org.apache.commons.codec.digest.DigestUtils;

public class MessageDigestUtils {
    public static String commonsCodecMD5(String str) {
        return DigestUtils.md5Hex(str);
    }
}
1.3 Bouncy Castle 实现 MD5
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.util.encoders.Hex;

public class MessageDigestUtils {
    public static String bouncyCastleMD5(String str) {
        Digest digest = new MD5Digest();
        digest.update(str.getBytes(), 0, str.getBytes().length);
        byte[] md5Bytes = new byte[digest.getDigestSize()];
        digest.doFinal(md5Bytes, 0);
        return Hex.toHexString(md5Bytes);
    }
}

2 SHA(Secure Hash Algorithm)

算法摘要长度实现方
SHA-1160JDK
SHA-224224Bouncy Castle
SHA-256256JDK
SHA-384384JDK
SHA-512512JDK
  • SHA 应用
    SHA
2.1 JDK 实现 SHA-1
import org.apache.commons.codec.binary.Hex;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MessageDigestUtils {
    public static String jdkSHA1(String str) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(str.getBytes());
            return Hex.encodeHexString(md.digest());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
2.2 Commons Codec 实现 SHA-1
import org.apache.commons.codec.digest.DigestUtils;

public class MessageDigestUtils {
    public static String commonsCodecSHA1(String str) {
        return DigestUtils.sha1Hex(str);
    }
}
2.3 Bouncy Castle 实现 SHA-1
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.util.encoders.Hex;

public class MessageDigestUtils {
    public static String bouncyCastleSHA1(String str) {
        Digest digest = new SHA1Digest();
        digest.update(str.getBytes(), 0, str.getBytes().length);
        byte[] sha1Bytes = new byte[digest.getDigestSize()];
        digest.doFinal(sha1Bytes, 0);
        return Hex.toHexString(sha1Bytes);
    }
}
2.4 Bouncy Castle 实现 SHA-224
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.Security;

public class MessageDigestUtils {
    public static String bouncyCastleSHA224(String str) {
        Security.addProvider(new BouncyCastleProvider());
        try {
            MessageDigest md = MessageDigest.getInstance("SHA224");
            md.update(str.getBytes());
            return Hex.encodeHexString(md.digest());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

3 MAC(Message Authentication Code)

算法摘要长度实现方
HmacMD2128Bouncy Castle
HmacMD4128Bouncy Castle
HmacMD5128JDK
HmacSHA1160JDK
HmacSHA224224Bouncy Castle
HmacSHA256256JDK
HmacSHA384384JDK
HmacSHA512512JDK
  • MAC 应用
    MAC
3.1 JDK 实现 HmacMD5
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class MessageDigestUtils {
    static final String KEY = "aa";
    
    public static String jdkHmacMD5(String str) {
        try {
            byte[] key = KEY.getBytes();
            SecretKey restoreKey = new SecretKeySpec(key, "HmacMD5");
            Mac mac = Mac.getInstance(restoreKey.getAlgorithm());
            mac.init(restoreKey);
            byte[] hmacMD5Bytes = mac.doFinal(str.getBytes());
            return Hex.encodeHexString(hmacMD5Bytes);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
3.2 Common Codec 实现 HmacMD5
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;

import javax.crypto.Mac;

public class MessageDigestUtils {
    static final String KEY = "aa";
    
    public static String commonsCodecHmacMD5(String str) {
        Mac mac = HmacUtils.getInitializedMac(HmacAlgorithms.HMAC_MD5, KEY.getBytes());
        return Hex.encodeHexString(mac.doFinal(str.getBytes()));
    }
}
3.3 Bouncy Castle 实现 HmacMD5
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.util.encoders.Hex;

public class MessageDigestUtils {
    static final String KEY = "aa";

    public static String bouncyCastleHmacMD5(String str) {
        HMac hMac = new HMac(new MD5Digest());
        hMac.init(new KeyParameter(KEY.getBytes()));
        hMac.update(str.getBytes(), 0, str.getBytes().length);
        byte[] hmacMD5Bytes = new byte[hMac.getMacSize()];
        hMac.doFinal(hmacMD5Bytes, 0);
        return Hex.toHexString(hmacMD5Bytes);
    }
}

参考

  1. GitHub
  2. Java实现Base64加密
  3. Java实现消息摘要算法加密
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值