SHA

作者: ghwaphon | 来源:发表于2016-09-11 15:01 被阅读55次

    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

    相关文章

      网友评论

        本文标题:SHA

        本文链接:https://www.haomeiwen.com/subject/uspuettx.html