1.3 SHA系列算法

信息摘要技术 - SHA系列

SHA系列算法分为三个分支:SHA-1SHA-2SHA-3,其中SHA-2包括SHA-224SHA-256SHA-384SHA-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算法应用场景类似,主要目的验证信息完整性,防篡改,下表是不同的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);
    }
}

你可能感兴趣的:(1.3 SHA系列算法)