爱生活,爱分享


java加密-03 java实现消息摘要加密

haiten 2019-09-08 598浏览 0条评论
首页/正文
分享到: / / / /

一、消息摘要算法

消息摘要算法 MD(Message Digest)

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

消息验证码算法 MAC(Message Authentication Code)

验证数据完整性 数字签名核心算法

二、消息摘要算法—MD

1、理论知识

MD家族(128位摘要信息)

  • MD2、MD4、MD5
算法 摘要长度 实现方
MD2 128 JDK
MD4 128 Bouncy Castle
MD5 128 JDK

适用场景举例:对用户密码多重消息摘要后再进行数据库的存储,防止数据库信息泄露后导致用户的密码信息泄露(如CSND数据库泄露事件)。

2、JDK 实现:

public static void jdkMD2() throws NoSuchAlgorithmException {
    String src = "test source";
		
    MessageDigest md = MessageDigest.getInstance("MD2");
    byte[] md2bytes = md.digest(src.getBytes());
    String md2Str = Hex.encodeHexString(md2bytes);
    System.out.println("md2Str:" + md2Str);
}

public static void jdkMD5() throws NoSuchAlgorithmException {
    String src = "test source";
		
    MessageDigest md = MessageDigest.getInstance("MD5");
    byte[] md5bytes = md.digest(src.getBytes());
    String md5Str = Hex.encodeHexString(md5bytes);
    System.out.println("md5Str:" + md5Str);
}

3、Commons Codec 实现:

public static void ccMD2() {
    String src = "test source";
		
    String md2Str = DigestUtils.md2Hex(src);
    System.out.println("md2Str:" + md2Str);
}

public static void ccMD5() {
    String src = "test source";
		
    String md5Str = DigestUtils.md5Hex(src);
    System.out.println("md5Str:" + md5Str);
}

4、Bouncy Castle 实现:

public static void bcMD2() {
    String src = "test source";
		
    Digest digest = new MD2Digest();
    digest.update(src.getBytes(), 0, src.getBytes().length);
    byte[] md2Bytes = new byte[digest.getDigestSize()];
    digest.doFinal(md2Bytes,0);
    String md2Str = org.bouncycastle.util.encoders.Hex.toHexString(md2Bytes);
    System.out.println("md2Str:" + md2Str);
}

public static void bcMD5() {
    String src = "test source";
		
    Digest digest = new MD5Digest();
    digest.update(src.getBytes(), 0, src.getBytes().length);
    byte[] md5Bytes = new byte[digest.getDigestSize()];
    digest.doFinal(md5Bytes,0);
    String md5Str = org.bouncycastle.util.encoders.Hex.toHexString(md5Bytes);
    System.out.println("md5Str:" + md5Str);
}

public static void bcMD4() {
    String src = "test source";
		
    Digest digest = new MD4Digest();
    digest.update(src.getBytes(), 0, src.getBytes().length);
    byte[] md4Bytes = new byte[digest.getDigestSize()];
    digest.doFinal(md4Bytes,0);
    String md4Str = org.bouncycastle.util.encoders.Hex.toHexString(md4Bytes);
    System.out.println("md4Str:" + md4Str);
}

public static void bcMD4s() throws NoSuchAlgorithmException {
    String src = "test source";
		
    Security.addProvider(new BouncyCastleProvider());
    MessageDigest md = MessageDigest.getInstance("MD4");
    byte[] md4bytes = md.digest(src.getBytes());
    String md4Str = Hex.encodeHexString(md4bytes);
    System.out.println("md4Str:" + md4Str);
}

三、消息摘要算法-SHA

1、理论知识

安全散列算法 固定长度摘要信息 SHA-1、SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)

算法 摘要长度 实现方
SHA-1 160 JDK
SHA-224 224 Bouncy Castle
SHA-256 256 JDK
SHA-384 384 JDK
SHA-512 512 JDK

适用场景举例:证书; 1、加入约定Key 2、增加时间戳 3、排序 http://**?msg=324ghjg234987ufasd×tamp=1309476876; msg:原始消息+key+时间戳。

2、JDK 实现:

public static void jskSHA1() throws NoSuchAlgorithmException {
    String src = "test source";
		
    MessageDigest md = MessageDigest.getInstance("SHA-1");
    byte[] sha1Bytes = md.digest(src.getBytes());
    String sha1Str = Hex.encodeHexString(sha1Bytes);
    System.out.println("sha1Str:" + sha1Str);
}

3、Commons Codec 实现:

public static void ccSHA1() {
    String src = "test source";
		
    String sha1Str = DigestUtils.sha1Hex(src);
    System.out.println("sha1Str:" + sha1Str);
}

4、Bouncy Castle 实现:

public static void bcSHA1() {
    String src = "test source";
		
    Digest digest = new SHA1Digest();
    digest.update(src.getBytes(), 0, src.getBytes().length);
    byte[] sha1Bytes = new byte[digest.getDigestSize()];
    digest.doFinal(sha1Bytes, 0);
    String sha1Str = org.bouncycastle.util.encoders.Hex.toHexString(sha1Bytes);
    System.out.println("sha1Str:" + sha1Str);
}

public static void bcSHA1s() throws NoSuchAlgorithmException {
    String src = "test source";
		
    Security.addProvider(new BouncyCastleProvider());
    MessageDigest md = MessageDigest.getInstance("SHA-224");
    byte[] sha1Bytes = md.digest(src.getBytes());
    String sha1Str = Hex.encodeHexString(sha1Bytes);
    System.out.println("sha1Str:" + sha1Str);
}

四、消息摘要算法—MAC

1、理论知识

MAC(Message Authentication Code)

HMAC(keyed-Hash Message Authentication Code),含有密钥的散列函数算法

融合MD、SHA

  • MD系列:HmacMD2、HmacMD4、HmacMD5

  • SHA系列:HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512

算法 摘要长度 实现方
HmacMD2 128 Bouncy Castle
HmacMD4 128 Bouncy Castle
HmacMD5 128 JDK
HmacSHA1 160 JDK
HmacSHA224 224 Bouncy Castle
HmacSHA256 256 JDK
HmacSHA384 384 JDK
HmacSHA512 512 JDK

应用场景如:SecureCRT 。

2、JDK 实现:

public static void jdkHmacMD5() throws NoSuchAlgorithmException, InvalidKeyException {
    String src = "test source";
		
    // 产生密钥
    KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
    Key secretKey = keyGenerator.generateKey();
    byte[] key = secretKey.getEncoded();
    String keyStr = Hex.encodeHexString(key);
    System.out.println("keyStr:" + keyStr);
    // byte[] key = "mykey0759".getBytes();
    // String keyStr = Hex.encodeHexString(key);
    // System.out.println("keyStr:" + keyStr);

    // 还原密钥
    Key restoreKey = new SecretKeySpec(key, "HmacMD5");
    Mac mac = Mac.getInstance(restoreKey.getAlgorithm());
    mac.init(restoreKey);
    byte[] hmacMD5Bytes = mac.doFinal(src.getBytes());
    String hmacMD5Str = Hex.encodeHexString(hmacMD5Bytes);
    System.out.println("hamcMD5Str:" + hmacMD5Str);
}

3、Bouncy Castle 实现:

public static void bcHmacMD5() throws DecoderException, NoSuchAlgorithmException {
    String src = "test source";
		
    // 产生密钥
    KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
    Key secretKey = keyGenerator.generateKey();
    byte[] key = secretKey.getEncoded();
    String keyStr = org.bouncycastle.util.encoders.Hex.toHexString(key);
    System.out.println("keyStr:" + keyStr);
    // byte[] key = "mykey0759".getBytes();
    // String keyStr = org.bouncycastle.util.encoders.Hex.toHexString(key);
    // System.out.println("keyStr:" + keyStr);

    // 还原密钥
    KeyParameter restoreKey = new KeyParameter(key);
    HMac hMac = new HMac(new MD5Digest());
    hMac.init(restoreKey);
    hMac.update(src.getBytes(), 0, src.getBytes().length);
    byte[] hmacMD5Bytes = new byte[hMac.getMacSize()];
    hMac.doFinal(hmacMD5Bytes, 0);
    String hmacMD5Str = Hex.encodeHexString(hmacMD5Bytes);
    System.out.println("hamcMD5Str:" + hmacMD5Str);
}

五、消息摘要算法-其它

RipeMD

Tiger

Whirlpool

GOST3411

Bouncy Castle实现

主要知识点来源于慕课慕课网上 moocer老师 提供的 java 加密系列教程。 原创不易,如需转载,请标明出处!

最后修改:2019-09-08 04:09:34 © 著作权归作者所有
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付

上一篇

发表评论

说点什么吧~

评论列表

还没有人评论哦~赶快抢占沙发吧~