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