SHA 算法简介
之前已经介绍过 MD5 算法的使用,从生成的 MD5 值我们可以看出,MD5 加密过后的长度是 32 位 16进制,也就是 128 位二进制,而 SHA 算法相比与 MD5 是更安全了,因为 SHA 最短的摘要长度也有 160 位二进制。SHA 算法也分好几种,如下所示
算法 摘要长度
SHA-1 160
SHA-256 256
SHA-384 384
SHA-512 512
按照正常的理解,生成摘要的长度越长就越安全,为什么呢?因为一旦摘要长度变长了,那么生成摘要的碰撞几率也就下降了,通俗的说,就是生成两个一模一样的摘要的概率降低了.
SHA 算法的使用
SHA 算法包含在 JDK 中,使用起来和 MD5 的使用方法一样,非常的简单,由于SHA 算法一般用于数字签名,下面我们以此为例介绍一下 SHA 的使用。
测量 JDK 的 SHA 值
将 jdk拖进项目
这里写图片描述
代码如下
public class TestSha {
public static final String PATH = "jdk-8u101-windows-x64.exe";
public static void main(String[] args) throws Exception {
String sha = getSHAOfFile(PATH);
System.out.println(sha);
}
public static String getSHAOfFile(String path) throws Exception {
FileInputStream stream = new FileInputStream(new File(path));
DigestInputStream digestInputStream = new DigestInputStream(stream, MessageDigest.getInstance("SHA-1"));
byte[] buffer = new byte[1024];
int read = digestInputStream.read(buffer, 0, 1024);
while (read != -1) {
read = digestInputStream.read(buffer, 0, 1024);
}
MessageDigest digest = digestInputStream.getMessageDigest();
byte[] resultBytes = digest.digest();
String resultString = byteToHexString(resultBytes);
return resultString;
}
public static String byteToHexString(byte[] bs) {
StringBuilder builder = new StringBuilder("");
if (bs == null || bs.length <= 0) {
return null;
}
for (int i = 0; i < bs.length; i++) {
int v = bs[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
builder.append(0);
}
builder.append(hv);
}
return builder.toString();
}
}
运行一下,输出结果为
8213503ea518db7c949b997c9b120f58d0bd2c10
网友评论