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