博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第四章 消息摘要算法--SHA
阅读量:6553 次
发布时间:2019-06-24

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

注意:本节内容主要参考自《Java加密与解密的艺术(第2版)》第6章“验证数据完整性--消息摘要算法”

4.1、SHA

原理:消息摘要长度(可以定量为加密后的字符串的长度)越长,安全性越高

  • MD5:128位二进制摘要(32位16进制字符串)(已破解)
  • SHA1:160位二进制摘要(40位16进制字符串)(已破解)
  • SHA256:256位二进制摘要(64位16进制字符串)(常用,在spring security中也有使用到)

实现方式:

  • Commons Codec(“CC”,最推荐,因为封装了JDK的底层代码,并且提供了二进制字节数组向十六进制转化的方法)
  • JDK(没有提供二进制字节数组向十六进制转化的方法,想要进行转化,需要借助BC)
  • Bouncy Castle(“BC”,不推荐,实现比较复杂)

下边只列出基于CC的工具类代码,至于基于JDK的代码可以参考“《Java加密与解密的艺术(第2版)》”,基于BC的代码可参考“慕课网”

4.1.1、基于CC的SHA加密算法

1 package com.util.sha; 2  3 import java.io.UnsupportedEncodingException; 4 import java.security.NoSuchAlgorithmException; 5 import org.apache.commons.codec.digest.DigestUtils; 6 /** 7  * 基于Commons Codec的SHA算法 8  */ 9 public class SHACC {10     private static final String ENCODING = "UTF-8";11     12     /**13      * SHA加密,加密后的结果为二进制字节数组14      */15     public static byte[] encode(String data) throws NoSuchAlgorithmException,UnsupportedEncodingException {16         //return DigestUtils.sha1(data.getBytes(ENCODING));//SHA-117         return DigestUtils.sha256(data.getBytes(ENCODING));//SHA-25618     }19     20     /**21      *SHA加密,加密后的结果为二进制字节数组,并且在这里将二进制字节数组转为了16进制字符串22      */23     public static String encodeSHAHex(String data) throws NoSuchAlgorithmException,UnsupportedEncodingException {24         //return new String(DigestUtils.sha1Hex(data.getBytes(ENCODING)));25         return new String(DigestUtils.sha256Hex(data.getBytes(ENCODING)));26     }27     28     /**29      * 测试30      * @param args31      * @throws UnsupportedEncodingException 32      * @throws NoSuchAlgorithmException 33      */34     public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException {35         36         String data = "找一个好姑娘做老婆是我的梦 想!";37         /*************测试encode()**************/38         System.out.println("原文-->"+data);39         byte[] encodedByte = SHACC.encode(data);40         System.out.println("加密后-->"+encodedByte);41         byte[] encodedByte2 = SHACC.encode(data);42         System.out.println("加密后-->"+encodedByte2);43         for(int i=0;i
"+data);48 String encodedStr = SHACC.encodeSHAHex(data);49 System.out.println("加密后-->"+encodedStr);50 String encodedStr2 = SHACC.encodeSHAHex(data);51 System.out.println("加密后-->"+encodedStr2);52 System.out.println(encodedStr.equals(encodedStr2));53 }54 }
View Code

在我们需要采用相应的sha算法的时候,只需选用不同的函数即可(具体查询Commons Codec的API即可,链接在第五章末尾)。

jar包的引入参考第二章的第一个例子进行即可,在测试的过程中,自己去试着看看“同一个消息多次进行SHA加密后结果是不是相同”;

在encode()方法的测试中判断两个byte[]是否相等:按索引依次比较两个字节数组中的元素是否相同即可(如果使用main方法去测的话);如果使用Junit,直接使用assertArrayEquals(array1,array2)即可。

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

你可能感兴趣的文章
HTML Input Text cursor position control
查看>>
阿里云应用安装 小记
查看>>
The Google File System(前五章,翻译的略乱)
查看>>
RUP 迭代开发计划的两种方法
查看>>
PHP中static关键字
查看>>
python处理xml实例
查看>>
从《一生所爱》到《世间始终你好》
查看>>
UIStackView相关
查看>>
数据库
查看>>
20145240问卷调查
查看>>
[转载]敏捷体验设计师应该具备的12项技能
查看>>
[linux] uptime 命令中关于平均负载的解释
查看>>
Algs4-1.4.25扔两个鸡蛋
查看>>
Algs4-2.4.22调优先队列的整数组大小
查看>>
设计模式之建造者
查看>>
模块化的JavaScript开发的优势在哪里
查看>>
上海某软件公司电话面试分享
查看>>
TCP 和 UDP 协议发送数据包的大小 (转载)
查看>>
用Alamofire进行网络请求的一段代码解析(一)
查看>>
elasticsearch的percolator操作
查看>>