SHA1 - Java加密与安全

SHA-1算法

SHA-1算法也是一种哈希算法,他的输出是160bits,也就是20个字节,SHA-1是由美国安全局开发的,这个SHA-1算法 

发布以后发现有问题,所以才作废了,这个作废的版本叫做SHA-0,以后发布的版本叫做SHA-1,紧接着又发布了SHA-256,

和SHA-512版本

我们来比较一下SHA-1的输出长度是160位,也就是20个字节,SHA-256输出长度是256位,也就是32个字节,SHA-512

输出长度是512bits,也就是64字节

用SHA-1算法计算摘要,和MD5非常类似,我们只是把MD5简单的替换成SHA-1,调用MessageDigest.getInstance("SHA-1")

就可以获得一个SHA-1的MessageDigest实例,最后我们也调用digest()方法获得SHA-1的byte字节表示的摘要,返回的是

20个字节
package com.learn.securl;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHADemo {

	public static byte[] sha1(byte[] input) {
		MessageDigest md = null;
		
		try {
			/**
			 * 我们注意到使用SHA-1算法的时候
			 * 和MD5相比,
			 * 我们只把MessageDigest.getInstance传入的MD5改成了SHA-1
			 * 就可以了
			 */
			md = MessageDigest.getInstance("SHA-1");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		md.update(input);
		return md.digest();
	}
	
	/**
	 * 剩下的代码是一样的
	 * 另外JAVA生成的摘要是20个字节
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		String s = "SHA1摘要算法测试";
		byte[] r = sha1(s.getBytes("UTF-8"));
		/**
		 * 所以我们用百分号040x输出这20个字节
		 * c87e25c44b9c470414b7adafb05864f97e6e6e8d
		 * 
		 */
		System.out.println(String.format("%040x", new BigInteger(1,r)));
	}
}
package com.learn.securl;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 我们再来看改进的Digest
 * @author Leon.Sun
 *
 */
public class DigestDemo {
	
	/**
	 * 我们对SHA1方法进行了改进
	 * 传入一个摘算法的名称
	 * 这样我们就可以传入任意的摘要算法来计算输入的摘要
	 * @param hashAlgorithm
	 * @param input
	 * @return
	 */
	public static byte[] digest(String hashAlgorithm, byte[] input) {
		MessageDigest md = null;
		
		try {
			md = MessageDigest.getInstance(hashAlgorithm);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		md.update(input);
		return md.digest();
	}
	
	public static void main(String[] args) throws Exception {
		String s = "Java摘要算法测试";
		byte[] input = s.getBytes("UTF-8");
		// 标准算法名称
		/**
		 * 我们可以访问JDK的官方网站
		 * ORACLE的官方网站访问摘要算法的名称
		 * 
		 */
		// http://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#MessageDigest
		/**
		 * 我们来看一下常用的算法,
		 * MD5
		 * MD5输出的是16个字节
		 */
		byte[] r1 = digest("MD5",input);
		System.out.println(r1.length + ": " + String.format("%032x", new BigInteger(1,r1)));
		/**
		 * SHA-1的输出是20个字节
		 */
		byte[] r2 = digest("SHA-1",input);
		System.out.println(r2.length + ": " + String.format("%040x", new BigInteger(1,r2)));
		/**
		 * SHA-256
		 * SHA-256输出的是32个字节
		 */
		byte[] r3 = digest("SHA-256",input);
		System.out.println(r3.length + ": " + String.format("%0"+(r3)));
		/**
		 * RipeMD160
		 * 当我们计算RipeMD160的时候,
		 * JDK报错
		 * 也就是JDK并没有包含RipeMD160算法
		 * 如果我们要查询JDK标准的算法
		 */
		byte[] r4 = digest("RipeMD160",input);
		System.out.println(r4.length + ": " + String.format("%0"+(r4)));
	}
}
1. SHA-1算法是一种比MD5更安全的算法

2. 他还有其他的哈希算法,比如SHA-256,SHA-512,RipeMD-160

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值