【Java小工匠聊密码学】--消息摘要--SHA算法
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 算法对比
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()); } }
如果读完觉得有收获的话,欢迎点赞、关注、加公众号【小工匠技术圈】
个人公众号,欢迎关注,查阅更多精彩历史!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
java core dump分析实战
hs_err_pid简介 hs_err_pid<pid>.log是java程序发生core的时候产生的文件,里面有当时出错时jvm的执行情况。 排查方法 头文件解读可以查看问题 头文件包含了简单的信息阐述,里面就core掉的原因 # # An unexpected error has been detected by Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x69ba3a96, pid=376, tid=1848 # # Java VM: Java HotSpot(TM) Client VM (11.0-b16 mixed mode, sharing windows-x86) # Problematic frame: # C [nvoglnt.dll+0x6a3a96] # 这里的问题是动态库的调用,这个库如果不是java自带的库,而是第三方的库,那么可以查看这个库是否和机型系统想匹配,如果不匹配换匹配的库就好,如果匹配,需要重新安装该库尝试。 # # Out ...
- 下一篇
【Java小工匠聊密码学】-密码学--综述
1、密码学的概述 1.1、密码学定义 密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。 1.2、密码学的基本功能 (1) 机密性 仅有发送方和指定的接收方能够理解传输的报文内容。窃听者可以截取到加密了的报文,但不能还原出原来的信息,即不能得到报文内容。 (2) 鉴别 发送方和接收方都应该能证实通信过程所涉及的另一方, 通信的另一方确实具有他们所声称的身份。即第三者不能冒充跟你通信的对方,能对对方的身份进行鉴别。 (3)报文完整性 即使发送方和接收方可以互相鉴别对方,但他们还需要确保其通信的内容在传输过程中未被改变。 (4)不可否认性 如果人们收到通信对方的报文后,还要证实报文确实来自所宣称的发送方,发送方也不能在发送报文以后否认自己发送过报文。 1.3、密码学五元组 (1)明文 (2)密文 (3)加密算法【公开】 (4)解密算法 【公开】 (5)密钥 2、密码学算法分类 2.1消息编码 常见消息编码 Base64 2.2 消息摘要 (1)对信息进行提炼,无秘钥,密文长度...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- 2048小游戏-低调大师作品
- Docker快速安装Oracle11G,搭建oracle11g学习环境