SHA算法分为两个分支:SHA-1和SHA-2,其中SHA-2包括SHA-224、SHA-256、SHA-384和SHA-512,SHA算法和MD算法类似,也是产生一个固定的散列码。
SHA算法家族发展历史
SHA算法被广泛的认为是MD5算法的继任者,由美国国家安全局(NSA)设计,经过美国标准与技术研究院(NIST)发布,发布历史比MD算法晚,相对安全:
- 1993年,NIST发布SHA-0算法:FIPS PUB 180,SHA-0发布不就即被NSA撤回,原因是不够安全;
- 1995年,NIST发布SHA-1算法:FIPS PUB 180-1,SHA-1算法被广泛用在TLS/SSL(HTTPS)、PGP、SSH、S/MIME、IPsec。
- SHA-1可对最大长度在264字节的信息做摘要,产生160位信息,转换为16进制为40位;
- SHA-1定义在RFC 3174中;
- 2002年,NIST发布SHA-2算法:FIPS PUB 180-2,包含SHA-256、SHA-384、SHA-512算法;
- 2004年,NIST发布SHA-2算法中的SHA-224,这是一个变种,主要是为了配合产生符合3DES所需要的秘钥长度而定义的算法;
应用场景
SHA算法的应用场景和MD算法应用场景类似,主要目的验证信息完整性,防篡改,下表是不同的SHA算法产生的秘钥的长度:
算法 | 产生的摘要长度 | 备注 |
---|---|---|
SHA-1 | 160 | JDK 6实现 |
SHA-256 | 256 | JDK 6实现 |
SHA-384 | 384 | JDK 6实现 |
SHA-512 | 512 | JDK 6实现 |
SHA-224 | 224 | Bouncy Castle实现,JDK不支持 |
Java中算法实现
SHA的算法调用和MD算法一样,也是通过MessageDigest类完成,getInstance的时候传入算法名称即可,也可以使用DigestInputStream,代码如下:
public class MD5Test {
public class MDInputStreamTest {
public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
// 待做消息摘要操作的原始信息
byte[] input = "sha-256".getBytes();
// 初始化MesssageDigest对象,将使用MD5算法
MessageDigest md = MessageDigest.getInstance("SHA-256");
// 构建DigestInputStream对象
DigestInputStream in = new DigestInputStream(new ByteArrayInputStream(input), md);
try {// 每次读取一段信息,计算MD5值,这里可以分次读取然后记录每次的MD5
in.read(input, 0, input.length);
// 获取摘要信息
byte[] rs = in.getMessageDigest().digest();
log(new String(HexBin.encode(rs)));
} finally {
in.close();
}
}
private static void log(String msg) {
System.out.println(msg);
}
}