SHA1 消息摘要

什么是 SHA1?

SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。SHA-1 可以生成一个被称为消息摘要的 160 位(20 字节)散列值,散列值通常的呈现形式为 40 个十六进制数。 

SHA-1 已经不再视为可抵御有充足资金、充足计算资源的攻击者。2005 年,密码分析人员发现了对 SHA-1 的有效攻击方法,这表明该算法可能不够安全,不能继续使用,自 2010 年以来,许多组织建议用 SHA-2 或 SHA-3 来替换 SHA-1。Microsoft、Google 以及Mozilla 都宣布,它们旗下的浏览器将在 2017 年前停止接受使用 SHA-1 算法签名的 SSL 证书。

2017年2月23日,CWI Amsterdam 与 Google 宣布了一个成功的 SHA-1 碰撞攻击,发布了两份内容不同但 SHA-1 散列值相同的 PDF 文件作为概念证明。

JDK

JDK 自带的 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。

实例:使用 JDK 的 MessageDigest 实现 SHA1 消息摘要。

import org.apache.commons.codec.binary.Hex;
import java.security.MessageDigest;

public class CryptSha1Demo1 {

    public static void main(String[] args) throws Exception {
        MessageDigest digest = MessageDigest.getInstance("SHA-1");
        byte[] bytes = digest.digest("hello world".getBytes());
        System.out.println(Hex.encodeHexString(bytes));
    }

}

输出结果:

2aae6c35c94fcfb415dbe95f408b9ce91ee846ed

Commons Codec

Apache Commons Codec 提供的 DigestUtils 类用于简化常见 MessageDigest(消息摘要)任务的操作。此类是不可变的并且是线程安全的。

实例1:使用 digest() 方法进行 SHA1 消息摘要算法计算。

import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.codec.digest.MessageDigestAlgorithms;
import sun.misc.MessageUtils;
import java.security.MessageDigest;

public class CryptSha1Demo2 {

    public static void main(String[] args) {
        // 方式1
        DigestUtils digestUtils = new DigestUtils(MessageDigestAlgorithms.SHA_1);
        System.out.println("方式1:" + Hex.encodeHexString(
                digestUtils.digest("hello world".getBytes())));

        // 方式2
        System.out.println("方式2:" + Hex.encodeHexString(
                DigestUtils.sha1("hello world".getBytes())));

        // 方式3
        System.out.println("方式3:" + Hex.encodeHexString(
                DigestUtils.sha1("hello world")));

        // 方式4
        MessageDigest messageDigest =
                DigestUtils.getDigest(MessageDigestAlgorithms.SHA_1);
        System.out.println("方式4:" + Hex.encodeHexString(
                DigestUtils.digest(messageDigest, "hello world".getBytes())));
    }

}

输出结果:

方式1:2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
方式2:2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
方式3:2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
方式4:2aae6c35c94fcfb415dbe95f408b9ce91ee846ed

注意:更多关于 DigestUtils 的用法,请参考官网API:

http://commons.apache.org/proper/commons-codec/apidocs/index.html

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号