SHA

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拖进项目


SHA_第1张图片
这里写图片描述

代码如下

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

你可能感兴趣的:(SHA)