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 自带的 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
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