前言
体能状态先于精神状态,习惯先于决心,聚焦先于喜好。
SHA 安全散列算法
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族.
和MD5类似,安全散列算法可以根据字符串生成一定长度的摘要信息,该摘要信息不可逆转,且不同的字符串的摘要信息相同的概率极低。
SHA家族
SHA 有多个算法,有一些已经过时不再推荐使用,有一些是安全度很高的,但是会降低性能。
SHA1
对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。
不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要,(但会有1x10 ^ 48分之一的机率出现相同的消息摘要,一般使用时忽略)。
可以用于校验信息是否被篡改,比如数字证书的签名
已经不安全了,所以数字签名证书多用SHA256
SHA256
SHA256 从功能上来说和 SHA1类似,一般也用于信息摘要,算法使用的哈希值长度是256位
用于数字证书的签名,一般数据的签名,目前流行的安全散列算法
SHA384、SHA512
内容略,更安全,也更消耗性能,截止2019年8月20日,这两种算法都还没有大范围推荐使用,市面上推荐的是 SHA256
安全性
目前而言,SHA1 不安全了,SHA256还是安全的
但是从兼容性来说,很多系统依旧支持SHA1,但是最新的则会要求是SHA256
Java 中的 SHA
使用 commons-codec
可以使用 Apache 提供的 jar 包 commons-codec
Maven 依赖如下
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
代码举例
结果是字节数组,转化为 16进制展示
Java
import org.apache.commons.codec.digest.DigestUtils;
public class ShaTest {
public static void main(String [] args){
String str="123";
String sha1HexStr=DigestUtils.sha1Hex(str.getBytes());
System.out.println("SHA1"+":"+sha1HexStr.length()+";"+sha1HexStr);
String sha256HexStr=DigestUtils.sha256Hex(str.getBytes());
System.out.println("SHA256"+":"+sha256HexStr.length()+";"+sha256HexStr);
String sha384HexStr=DigestUtils.sha384Hex(str.getBytes());
System.out.println("SHA384"+":"+sha384HexStr.length()+";"+sha384HexStr);
String sha512HexStr=DigestUtils.sha512Hex(str.getBytes());
System.out.println("SHA512"+":"+sha512HexStr.length()+";"+sha512HexStr);
}
}
结果-使用16进制展示
SHA1:40;40bd001563085fc35165329ea1ff5c5ecbdbbeef
SHA256:64;a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
SHA384:96;9a0a82f0c0cf31470d7affede3406cc9aa8410671520b727044eda15b4c25532a9b5cd8aaf9cec4919d76255b6bfb00f
SHA512:128;3c9909afec25354d551dae21590bb26e38d53f2173b8d3dc3eee4c047e7ab1c1eb8b85103e3be7ba613b31bb5c9c36214dc9f14a42fd7a2fdb84856bca5c44c2