信息摘要技术 - SHA系列
SHA系列算法分为三个分支:SHA-1
、SHA-2
和SHA-3
,其中SHA-2
包括SHA-224
、SHA-256
、SHA-384
和SHA-512
,SHA算法和MD算法类似,也是产生一个固定长度的散列码。
SHA-1
/SHA-2
此类叫法是按照SHA算法的版本划分的,SHA-256
/SHA-512
是按照产生的密钥长度划分的,二者的划分维度不同。
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中;
- SHA-1在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的散列函数)的后继者;
- SHA-1的安全性在2000年以后已经不被大多数的加密场景所接受;
- 2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1;
- 2002年,NIST发布SHA-2算法:参考FIPS PUB 180-2,包含SHA-256、SHA-384、SHA-512算法;
- 今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;
- 2004年,NIST发布SHA-2算法中的SHA-224,这是一个变种,主要是为了产生符合3DES所需要的秘钥长度而定义;
- 2015年,NIST发布SHA-3版本:SHA-3并不是要取代SHA-2,因为SHA-2目前并没有出现明显的弱点;
应用场景
SHA算法的应用场景和MD算法应用场景类似,主要目的<font color = 'red'>验证信息完整性,防篡改</font>,下表是不同的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 Sha256InputStreamTest {
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);
}
}
网友评论