目录

  • 一、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加密(原生摘要)相关推荐

  1. Java | 加密技术 | 摘要加密算法(不含原理)

    一.背景简介 1.1 含义 消息摘要采用单向Hash函数将需加密的明文"摘要"成一串密文,这一串密文亦称为数字指纹(Finger Print).它有固定的长度,且不同的明文摘要成密 ...

  2. java.security 框架之签名、加密、摘要及证书

      和第三方系统对接时,需要对隐私数据进行加密,对请求报文进行签名等.加密算法分为单向加密.对称加密.非对称加密等,其对应的算法也各式各样.Java 提供了统一的框架(java.security.*) ...

  3. java 512加密_java实现SHA256、SHA512、MD5加密

    java.security.MessageDigest这个类里集成了sha256,sha512和md5的加密方法,jdk原生支持这三个加密方式,一下方便了好多,代码如下: package com.ly ...

  4. java 操作Zip文件(压缩、解压、加密)

    java 操作Zip文件(压缩.解压.加密) 依赖:点击下载 package com.zxl.test;import net.lingala.zip4j.model.ZipParameters; im ...

  5. Java带KeyGenerator(密钥生成器)生成AES加密,c++里面AES解密

    之前文章Java里面生成AES加密,c++里面AES解密介绍了Java代码加密,c++代码解密.本文介绍:Java带KeyGenerator(密钥生成器)生成AES加密,c++里面AES解密 一.Ja ...

  6. java对sha1的解密_Java实现文件的加密解密功能示例

    本文实例讲述了java实现文件的加密解密功能分享给大家供大家参考,具体如下: package com.copy.encrypt; import java.io.file; import java.io ...

  7. 常用加密算法的Java实现(一) ——单向加密算法MD5和SHA

    1.Java的安全体系架构 1.1           Java的安全体系架构介绍 Java中为安全框架提供类和接口.JDK 安全 API 是 Java 编程语言的核心 API,位于 java.sec ...

  8. erlang java 加解密(2)消息摘要算法(MD、SHA、MAC)之SHA

    java加解密相关资料和代码参考<java加密与解密的艺>http://snowolf.iteye.com/blog/379860 sha(Data) -> Digest Types ...

  9. java aes 256 ctr,AES CTR 256 OpenSSL上的加密操作模式

    新的OpenSSL,任何人可以给我一个提示如何从C文件初始化AES CTR模式.我知道这是方法的签名,但我有参数的问题,没有很多文档没有一个明确的例子如何进行简单的加密.如果有人可以举例说明这种方法的 ...

最新文章

  1. nginx 正则 结尾 配置_nginx location 配置阐述优先级别使用说明-不当可能存在安全隐患...
  2. bootstrap模态框
  3. Newbe.Claptrap 0.9.4 发布,全新构建
  4. MySQL之——GROUP BY分组取字段最大值
  5. python 将图片与字符串相互转换
  6. 最全机器学习种类讲解:监督、无监督、在线和批量学习都讲明白了
  7. android 一个界面显示多个窗口,Android Studio多个项目窗口怎么切换?
  8. C++自动类型转化--特殊构造函数方法和重载的运算符方法
  9. 小峰servlet/jsp(4)EL表达式
  10. liunx是相关总结
  11. 微信公众号迁移公证办理流程
  12. 谷歌将英文网站翻译成中文
  13. 语义漂移_当概念漂移是语义漂移时
  14. 《我与长安城的朝花夕拾》
  15. 网易云音乐小程序登录接口显示400,拥挤问题解决
  16. 产品经理(22) #运营
  17. 程序员的情感修养 —— 专访“非诚勿扰”牵手成功男嘉宾程序员石川
  18. Python中reshape函数参数-1的意思?
  19. 四年级计算机使用登记表,小学音乐器材使用登记表.doc
  20. 【源代码管理工具GIT】

热门文章

  1. 一年级下册数学计算机应用题,【小学一年级数学练习题】小学生和机器人
  2. 启动定时器t0的工作指令是_启动定时器T0工作,可使用SETB TR0启动。_学小易找答案...
  3. python 求pi_python下利用无穷级数计算pi值
  4. 2022年中国数字藏品行业研究报告 附下载
  5. VBoxManager很强大哈!
  6. 小技巧|CSS如何实现文字两端对齐
  7. 海康威视IPCamera图像捕获方法:捕获实时流,将实时流解码成YV12,然后转换成RGB
  8. 打开我的电脑出现不支持此接口
  9. 低频电磁波与高频电磁波优势与劣势
  10. 联通GPRS上网设置