博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Java小工匠聊密码学】--消息摘要--SHA算法
阅读量:6568 次
发布时间:2019-06-24

本文共 7001 字,大约阅读时间需要 23 分钟。

1、什么是SHA算法

  安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是联邦信息处理标准(Federal Information Processing Standards,FIPS)所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。

2、SHA算法发展史

2.1 SHA-0

SHA由美国标准与技术研究所(NIST)设计并于1993年发表,该版本称为SHA-0,很快被发现存在安全隐患。

2.2 SHA-1

由于SHA-0中存在的安全隐患,SHA由美国标准与技术研究所(NIST)设计并于1995年发表SHA-1,2005年 SHA-1 算法被破解。

SHA-1在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。
但SHA-1的安全性如今被密码学家严重质疑。

2.3 SHA-2

NIST在2002年发布了三个额外的SHA变体,这三个函数都将讯息对应到更长的讯息摘要。以它们的摘要长度(以位元计算)加在原名后面来命名:SHA-256,SHA-384和SHA-512。2004年2月加入了一个额外的变种SHA-224",这是为了符合双金钥3DES所需的金钥长度而定义。

至今尚未出现对SHA-2有效的攻击。

3、 SHA 算法对比

image.png

4、SHA 算法实现

4.1 JDK 实现

package lzf.cipher.jdk;import java.nio.charset.Charset;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/** * @author Java 小工匠 */public class JdkShaUtils {    // SHA 与 SHA-1 算法等价    public static String sha(byte[] bytes) {        return shaBase("SHA", bytes);    }    // SHA-1 算法    public static String sha1(byte[] bytes) {        return shaBase("SHA-1", bytes);    }    // SHA-256 算法    public static String sha256(byte[] bytes) {        return shaBase("SHA-256", bytes);    }    // SHA-384 算法    public static String sha384(byte[] bytes) {        return shaBase("SHA-384", bytes);    }    // SHA-521 算法    public static String sha512(byte[] bytes) {        return shaBase("SHA-512", bytes);    }    // SHA基础算法    public static String shaBase(String sha, byte[] bytes) {        try {            // 1、获得SHA摘要算法的 MessageDigest 对象            MessageDigest digest = MessageDigest.getInstance(sha);            // 2、使用指定的字节更新摘要            digest.update(bytes);            // 3、获得密文            byte[] rsBytes = digest.digest();            // 4、把密文转换成十六进制的字符串形式            return encodeHex(rsBytes);        } catch (NoSuchAlgorithmException e) {            throw new RuntimeException(e.getMessage(), e);        }    }    // 数据准16进制编码    public static String encodeHex(final byte[] data) {        return encodeHex(data, true);    }    // 数据转16进制编码    public static String encodeHex(final byte[] data, final boolean toLowerCase) {        final char[] DIGITS_LOWER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };        final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };        final char[] toDigits = toLowerCase ? DIGITS_LOWER : DIGITS_UPPER;        final int l = data.length;        final char[] out = new char[l << 1];        // two characters form the hex value.        for (int i = 0, j = 0; i < l; i++) {            out[j++] = toDigits[(0xF0 & data[i]) >>> 4];            out[j++] = toDigits[0x0F & data[i]];        }        return new String(out);    }    public static void main(String[] args) {        byte[] bytes = "java小工匠".getBytes(Charset.forName("UTF-8"));        String sha = sha(bytes);        System.out.println("   sha:" + sha + ",lengh=" + sha.length());        String sha1 = sha1(bytes);        System.out.println("  sha1:" + sha1 + ",lengh=" + sha1.length());        String sha256 = sha256(bytes);        System.out.println("sha256:" + sha256 + ",lengh=" + sha256.length());        String sha384 = sha384(bytes);        System.out.println("sha384:" + sha384 + ",lengh=" + sha384.length());        String sha512 = sha512(bytes);        System.out.println("sha512:" + sha512 + ",lengh=" + sha512.length());    }}

4.2 CC实现

package lzf.cipher.cc;import java.nio.charset.Charset;import org.apache.commons.codec.digest.DigestUtils;/** * @author Java 小工匠 */public class CCShaUtils {    // SHA 与 SHA-1 算法等价    public static String sha(byte[] bytes) {        return DigestUtils.sha1Hex(bytes);    }    // SHA-1 算法    public static String sha1(byte[] bytes) {        return DigestUtils.sha1Hex(bytes);    }    // SHA-256 算法    public static String sha256(byte[] bytes) {        return DigestUtils.sha256Hex(bytes);    }    // SHA-384 算法    public static String sha384(byte[] bytes) {        return DigestUtils.sha384Hex(bytes);    }    // SHA-521 算法    public static String sha512(byte[] bytes) {        return DigestUtils.sha512Hex(bytes);    }    public static void main(String[] args) {        byte[] bytes = "java小工匠".getBytes(Charset.forName("UTF-8"));        String sha = sha(bytes);        System.out.println("   sha:" + sha + ",lengh=" + sha.length());        String sha1 = sha1(bytes);        System.out.println("  sha1:" + sha1 + ",lengh=" + sha1.length());        String sha256 = sha256(bytes);        System.out.println("sha256:" + sha256 + ",lengh=" + sha256.length());        String sha384 = sha384(bytes);        System.out.println("sha384:" + sha384 + ",lengh=" + sha384.length());        String sha512 = sha512(bytes);        System.out.println("sha512:" + sha512 + ",lengh=" + sha512.length());    }}

4.3 BC实现

package lzf.cipher.bc;import java.nio.charset.Charset;import org.bouncycastle.crypto.Digest;import org.bouncycastle.crypto.digests.SHA1Digest;import org.bouncycastle.crypto.digests.SHA256Digest;import org.bouncycastle.crypto.digests.SHA384Digest;import org.bouncycastle.crypto.digests.SHA512Digest;import org.bouncycastle.util.encoders.Hex;/** * @author Java 小工匠 */public class BCShaUtils {    // SHA-1 算法    public static String sha1(byte[] bytes) {        Digest digest = new SHA1Digest();        digest.update(bytes, 0, bytes.length);        byte[] rsData = new byte[digest.getDigestSize()];        digest.doFinal(rsData, 0);        return Hex.toHexString(rsData);    }    // SHA-256 算法    public static String sha256(byte[] bytes) {        Digest digest = new SHA256Digest();        digest.update(bytes, 0, bytes.length);        byte[] rsData = new byte[digest.getDigestSize()];        digest.doFinal(rsData, 0);        return Hex.toHexString(rsData);    }    // SHA-384 算法    public static String sha384(byte[] bytes) {        Digest digest = new SHA384Digest();        digest.update(bytes, 0, bytes.length);        byte[] rsData = new byte[digest.getDigestSize()];        digest.doFinal(rsData, 0);        return Hex.toHexString(rsData);    }    // SHA-521 算法    public static String sha512(byte[] bytes) {        Digest digest = new SHA512Digest();        digest.update(bytes, 0, bytes.length);        byte[] rsData = new byte[digest.getDigestSize()];        digest.doFinal(rsData, 0);        return Hex.toHexString(rsData);    }    public static void main(String[] args) {        byte[] bytes = "java小工匠".getBytes(Charset.forName("UTF-8"));        String sha1 = sha1(bytes);        System.out.println("  sha1:" + sha1 + ",lengh=" + sha1.length());        String sha256 = sha256(bytes);        System.out.println("sha256:" + sha256 + ",lengh=" + sha256.length());        String sha384 = sha384(bytes);        System.out.println("sha384:" + sha384 + ",lengh=" + sha384.length());        String sha512 = sha512(bytes);        System.out.println("sha512:" + sha512 + ",lengh=" + sha512.length());    }}

如果读完觉得有收获的话,欢迎点赞、关注、加公众号【小工匠技术圈】

个人公众号,欢迎关注,查阅更多精彩历史!

image

转载地址:http://clcjo.baihongyu.com/

你可能感兴趣的文章
$.extend({},defaults, options) --(初体验三)
查看>>
jQuery hover() 方法
查看>>
android 一步一步教你集成tinker(热修复)
查看>>
到底有多少内存
查看>>
centos7.3 安装ovirt-engine4.0 版本
查看>>
Jenkins+git+tomcat 自动化持续部署
查看>>
项目log日志打印
查看>>
Openstack的环境的Mitaka部署环境服务,实例(1)
查看>>
文档的压缩与打包
查看>>
python3 在不同操作系统安装第三方库方法
查看>>
python编写登录接口
查看>>
MySQL高可用方案之多级复制
查看>>
OVS 中的各种网络设备 - 每天5分钟玩转 OpenStack(128)
查看>>
Trafficserver Cluster模式
查看>>
亚马逊推出 Blox,用于 EC2 容器服务的开源工具集合
查看>>
Linux:在中国没有真正的新闻
查看>>
iOS推送功能极光推送的介绍与实现
查看>>
单用户模式与grub加密
查看>>
Chromium Graphics: 3D上下文及其虚拟化 - Part I
查看>>
jquery javascript获得网页的高度和宽度
查看>>