Java实现SHA-1、SHA-256和SHA-512加密(原生摘要)
目录
- 一、SHA简介
- 二、SHA家族特点
- 三、SHA工具类
- 四、实践
- 结语
一、SHA简介
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
目前SHA有五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美国安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布,也是美国的政府标准,后四者有时并称为SHA-2。
二、SHA家族特点
SHA家族各个参数对比如下:
/ | SHA-1 | SHA-224 | SHA-256 | SHA-SHA-384 | SHA-512 |
---|---|---|---|---|---|
消息摘要长度 | 160 | 224 | 256 | 384 | 512 |
消息长度 | 2 64 2^{64} 264 | 2 64 2^{64} 264 | 2 64 2^{64} 264 | 2 128 2^{128} 2128 | 2 128 2^{128} 2128 |
字长度 | 32 | 32 | 32 | 64 | 64 |
分组长度 | 512 | 512 | 512 | 1024 | 1024 |
步骤数 | 80 | 64 | 64 | 80 | 80 |
三、SHA工具类
工作中经常用的SHA的加密方法,比如SHA-1、SHA-224、SHA-256、SHA-384,SHA-512,总是分不清楚,让自己疑惑:是不是要写几个不同的工具类去实现?来,我告诉你!一个就够了,用Java原生摘要实现SHA的加密。
ShaUtil .java
package com.alian.csdn.utils;import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;/*** @program: CSDN* @description: SHA工具类* @author: Alian* @create: 2021-06-01 15:20:10**/
public class ShaUtil {private static final String SHA_1 = "SHA-1";private static final String SHA_224 = "SHA-224";private static final String SHA_256 = "SHA-256";private static final String SHA_384 = "SHA-384";private static final String SHA_512 = "SHA-512";private static final char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};public static String getSHA1(String painText, boolean uppercase) {return getSha(painText, SHA_1, uppercase);}public static String getSHA224(String painText, boolean uppercase) {return getSha(painText, SHA_224, uppercase);}public static String getSHA256(String painText, boolean uppercase) {return getSha(painText, SHA_256, uppercase);}public static String getSHA384(String painText, boolean uppercase) {return getSha(painText, SHA_384, uppercase);}public static String getSHA512(String painText, boolean uppercase) {return getSha(painText, SHA_512, uppercase);}/*** 利用Java原生摘要实现SHA加密(支持大小写,默认小写)** @param plainText 要加密的数据* @param algorithm 要使用的算法(SHA-1,SHA-2224,SHA-256,SHA-384,SHA-512)* @param uppercase 是否转为大写* @return*/private static String getSha(String plainText, String algorithm, boolean uppercase) {//输入的字符串转换成字节数组byte[] bytes = plainText.getBytes(StandardCharsets.UTF_8);MessageDigest messageDigest;try {//获得SHA转换器messageDigest = MessageDigest.getInstance(algorithm);//bytes是输入字符串转换得到的字节数组messageDigest.update(bytes);} catch (NoSuchAlgorithmException e) {throw new RuntimeException("SHA签名过程中出现错误,算法异常");}//转换并返回结果,也是字节数组,包含16个元素byte[] digest = messageDigest.digest();//字符数组转换成字符串返回String result = byteArrayToHexString(digest);//转换大写return uppercase ? result.toUpperCase() : result;}/*** 将字节数组转为16进制字符串** @param bytes 要转换的字节数组* @return*/private static String byteArrayToHexString(byte[] bytes) {StringBuilder builder = new StringBuilder();for (byte b : bytes) {//java.lang.Integer.toHexString() 方法的参数是int(32位)类型,//如果输入一个byte(8位)类型的数字,这个方法会把这个数字的高24为也看作有效位,就会出现错误//如果使用& 0XFF操作,可以把高24位置0以避免这样错误String temp = Integer.toHexString(b & 0xFF);if (temp.length() == 1) {//1得到一位的进行补0操作builder.append("0");}builder.append(temp);}return builder.toString();}}
四、实践
接下里我们对ShaUtil工具类进行一些测试,代码如下:
/*** SHA计算(SHA-1,SHA-2224,SHA-256,SHA-384,SHA-512)* 此处单元测试的注解是采用:org.junit.Test*/@Testpublic void sha() {String plainText="Alian";System.out.println("-----------------------------------SHA1-------------------------------------------------");System.out.println("小写的SHA1加密结果:"+ShaUtil.getSHA1(plainText,false));System.out.println("大写的SHA1加密结果:"+ShaUtil.getSHA1(plainText,true));System.out.println("-----------------------------------SHA224-----------------------------------------------");System.out.println("小写的SHA224加密结果:"+ShaUtil.getSHA224(plainText,false));System.out.println("大写的SHA224加密结果:"+ShaUtil.getSHA224(plainText,true));System.out.println("-----------------------------------SHA256-----------------------------------------------");System.out.println("小写的SHA256加密结果:"+ShaUtil.getSHA256(plainText,false));System.out.println("大写的SHA256加密结果:"+ShaUtil.getSHA256(plainText,true));System.out.println("-----------------------------------SHA384-----------------------------------------------");System.out.println("小写的SHA384加密结果:"+ShaUtil.getSHA384(plainText,false));System.out.println("大写的SHA384加密结果:"+ShaUtil.getSHA384(plainText,true));System.out.println("-----------------------------------SHA512-----------------------------------------------");System.out.println("小写的SHA512加密结果:"+ShaUtil.getSHA512(plainText,false));System.out.println("大写的SHA512加密结果:"+ShaUtil.getSHA512(plainText,true));}
运行结果:
-----------------------------------SHA1-------------------------------------------------
小写的SHA1加密结果:58800795a56cf404b5f67173c20dbc0a3eace5a6
大写的SHA1加密结果:58800795A56CF404B5F67173C20DBC0A3EACE5A6
-----------------------------------SHA224-----------------------------------------------
小写的SHA224加密结果:c2dc46888be174c2599aabd58e78177f3d2f4a795a7724fbed0b78f1
大写的SHA224加密结果:C2DC46888BE174C2599AABD58E78177F3D2F4A795A7724FBED0B78F1
-----------------------------------SHA256-----------------------------------------------
小写的SHA256加密结果:8c9781ffb256b431a5e38b9f7bd81df0c4bcbd0f835feb31126c4f5a7f4bb5e2
大写的SHA256加密结果:8C9781FFB256B431A5E38B9F7BD81DF0C4BCBD0F835FEB31126C4F5A7F4BB5E2
-----------------------------------SHA384-----------------------------------------------
小写的SHA384加密结果:9fbdf2441015cf0c8e49a49b3ce88fc0d508e33f8313dfa452239b4062b45a07df9938ebac3c7198353cf3aad18ae655
大写的SHA384加密结果:9FBDF2441015CF0C8E49A49B3CE88FC0D508E33F8313DFA452239B4062B45A07DF9938EBAC3C7198353CF3AAD18AE655
-----------------------------------SHA512-----------------------------------------------
小写的SHA512加密结果:2daf6197b540d862ce2c73edb14e3ff9e743724e3b96592a4cd71797ffe045b5a5d89865632e86ed338f2c534b4f698818fa670b7eae28dc493d1e1f4a455c89
大写的SHA512加密结果:2DAF6197B540D862CE2C73EDB14E3FF9E743724E3B96592A4CD71797FFE045B5A5D89865632E86ED338F2C534B4F698818FA670B7EAE28DC493D1E1F4A455C89
结语
以上就是今天要讲的内容,本文简单介绍了SHA,并编写了一个SHA工具类,有兴趣的同学可以去了解一下SHA算法的原理,因为安全性问题,平常的工作中尽量不使用SHA-1,改为SHA-256或者SHA-512或者采用其他安全性高的算法。如果觉得对你有帮助,欢迎大家评论交流。
Java实现SHA-1、SHA-256和SHA-512加密(原生摘要)相关推荐
- Java | 加密技术 | 摘要加密算法(不含原理)
一.背景简介 1.1 含义 消息摘要采用单向Hash函数将需加密的明文"摘要"成一串密文,这一串密文亦称为数字指纹(Finger Print).它有固定的长度,且不同的明文摘要成密 ...
- java.security 框架之签名、加密、摘要及证书
和第三方系统对接时,需要对隐私数据进行加密,对请求报文进行签名等.加密算法分为单向加密.对称加密.非对称加密等,其对应的算法也各式各样.Java 提供了统一的框架(java.security.*) ...
- java 512加密_java实现SHA256、SHA512、MD5加密
java.security.MessageDigest这个类里集成了sha256,sha512和md5的加密方法,jdk原生支持这三个加密方式,一下方便了好多,代码如下: package com.ly ...
- java 操作Zip文件(压缩、解压、加密)
java 操作Zip文件(压缩.解压.加密) 依赖:点击下载 package com.zxl.test;import net.lingala.zip4j.model.ZipParameters; im ...
- Java带KeyGenerator(密钥生成器)生成AES加密,c++里面AES解密
之前文章Java里面生成AES加密,c++里面AES解密介绍了Java代码加密,c++代码解密.本文介绍:Java带KeyGenerator(密钥生成器)生成AES加密,c++里面AES解密 一.Ja ...
- java对sha1的解密_Java实现文件的加密解密功能示例
本文实例讲述了java实现文件的加密解密功能分享给大家供大家参考,具体如下: package com.copy.encrypt; import java.io.file; import java.io ...
- 常用加密算法的Java实现(一) ——单向加密算法MD5和SHA
1.Java的安全体系架构 1.1 Java的安全体系架构介绍 Java中为安全框架提供类和接口.JDK 安全 API 是 Java 编程语言的核心 API,位于 java.sec ...
- erlang java 加解密(2)消息摘要算法(MD、SHA、MAC)之SHA
java加解密相关资料和代码参考<java加密与解密的艺>http://snowolf.iteye.com/blog/379860 sha(Data) -> Digest Types ...
- java aes 256 ctr,AES CTR 256 OpenSSL上的加密操作模式
新的OpenSSL,任何人可以给我一个提示如何从C文件初始化AES CTR模式.我知道这是方法的签名,但我有参数的问题,没有很多文档没有一个明确的例子如何进行简单的加密.如果有人可以举例说明这种方法的 ...
最新文章
- nginx 正则 结尾 配置_nginx location 配置阐述优先级别使用说明-不当可能存在安全隐患...
- bootstrap模态框
- Newbe.Claptrap 0.9.4 发布,全新构建
- MySQL之——GROUP BY分组取字段最大值
- python 将图片与字符串相互转换
- 最全机器学习种类讲解:监督、无监督、在线和批量学习都讲明白了
- android 一个界面显示多个窗口,Android Studio多个项目窗口怎么切换?
- C++自动类型转化--特殊构造函数方法和重载的运算符方法
- 小峰servlet/jsp(4)EL表达式
- liunx是相关总结
- 微信公众号迁移公证办理流程
- 谷歌将英文网站翻译成中文
- 语义漂移_当概念漂移是语义漂移时
- 《我与长安城的朝花夕拾》
- 网易云音乐小程序登录接口显示400,拥挤问题解决
- 产品经理(22) #运营
- 程序员的情感修养 —— 专访“非诚勿扰”牵手成功男嘉宾程序员石川
- Python中reshape函数参数-1的意思?
- 四年级计算机使用登记表,小学音乐器材使用登记表.doc
- 【源代码管理工具GIT】
热门文章
- 一年级下册数学计算机应用题,【小学一年级数学练习题】小学生和机器人
- 启动定时器t0的工作指令是_启动定时器T0工作,可使用SETB TR0启动。_学小易找答案...
- python 求pi_python下利用无穷级数计算pi值
- 2022年中国数字藏品行业研究报告 附下载
- VBoxManager很强大哈!
- 小技巧|CSS如何实现文字两端对齐
- 海康威视IPCamera图像捕获方法:捕获实时流,将实时流解码成YV12,然后转换成RGB
- 打开我的电脑出现不支持此接口
- 低频电磁波与高频电磁波优势与劣势
- 联通GPRS上网设置