美文网首页
1.3 SHA系列算法

1.3 SHA系列算法

作者: saillen | 来源:发表于2018-11-28 17:48 被阅读0次

    信息摘要技术 - 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算法应用场景类似,主要目的<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);
        }
    }
    

    相关文章

      网友评论

          本文标题:1.3 SHA系列算法

          本文链接:https://www.haomeiwen.com/subject/xtuzqqtx.html