美文网首页
算法系列:5分钟了解哈希算法

算法系列:5分钟了解哈希算法

作者: 千锋陈老师 | 来源:发表于2019-05-30 17:05 被阅读0次

    前言

    哈希算法是现代密码体系中的一个重要组成部分。大家比较感兴趣的数字货币,就使用了哈希算法。

    哈希算法简介

    哈希(hash)算法又称为散列算法,通过hash算法,可以将任意长度的信息转换成一个固定长度的二进制数据,我们经常会使用十六进制值来表示转换后的信息。

    比如,数字123,使用md5的hash算法后,得到十六进制的值:202cb962ac59075b964b07152d234b70

    哈希算法的特点:

    (1)不同的信息,理论上得到的hash值不同,我们称之为“无碰撞”,或者发生“碰撞”的概率非常小。

    (2)不可逆,hash算法是单向的,从hash值反向推导出原始信息是很困难的。所以,有些系统中,我们可以使用hash算法对密码进行处理后保存。

    hash算法的主要应用:

    (1) 数据完整性校验

    我们可以将原始数据和经过哈希算法得到数据一块发送给对方,对方收到数据之后,对数据使用相同的哈希算法进行计算,如果得到的哈希值和对方发过来的相同,那么就说明数据没有经过篡改。

    (2) 数字签名

    一般我们先对原始数据进行hash处理,然后对处理后的数据使用私钥进行加密。将原始数据和加密后数据发送给接收方。接收方使用公钥解密,然后对数据进行hash处理,最后对比,借此实现用户身份的验证。

    常见哈希算法

    1 MD5

    MD5在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。

    MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128bit位散列值。

    2 SHA-1

    SHA(Secure Hash Algorithm)安全散列算法是一个密码散列家族,由美国国家安全局(NSA)所设计,也是一种哈希算法。

    SHA-1 算法输入以512位数据块为单位处理,产生160比特的消息摘要作为输出。

    3 代码

    如果我们想使用相关hash算法进行处理,一般不需要自己进行实现,只需要调用java或者第三方提供的代码即可。比如,如果想根据md5算法得到一个字符串的的hash值,代码如下:

    public static String md5(String plainText) {

    //定义一个字节数组

    byte[] secretBytes = null;

    try {

    // 生成一个MD5计算摘要的对象

    MessageDigest md = MessageDigest.getInstance("MD5");

    //对字符串进行hash处理

    md.update(plainText.getBytes());

    //获得hash运算后数据

    secretBytes = md.digest();

    } catch (NoSuchAlgorithmException e) {

    throw new RuntimeException("没有md5这个算法!");

    }

    //将hash后的数据转换为16进制数字

    String md5code = new BigInteger(1, secretBytes).toString(16);// 16进制数字

    // 如果生成数字未满32位,需要前面补0

    for (int i = 0; i < 32 - md5code.length(); i++) {

    md5code = "0" + md5code;

    }

    return md5code;

    }

    总结

    哈希算法有很多,计算过程也比较复杂,但是大多数情况下,我们不用自己写代码实现这些算法,只需要调用相关算法库中的方法即可。

    相关文章

      网友评论

          本文标题:算法系列:5分钟了解哈希算法

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