第四章 消息摘要算法--SHA
注意:本节内容主要参考自《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加密算法
package com.util.sha; import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; import org.apache.commons.codec.digest.DigestUtils; /** * 基于Commons Codec的SHA算法 */ public class SHACC { private static final String ENCODING = "UTF-8"; /** * SHA加密,加密后的结果为二进制字节数组 */ public static byte[] encode(String data) throws NoSuchAlgorithmException,UnsupportedEncodingException { //return DigestUtils.sha1(data.getBytes(ENCODING));//SHA-1 return DigestUtils.sha256(data.getBytes(ENCODING));//SHA-256 } /** *SHA加密,加密后的结果为二进制字节数组,并且在这里将二进制字节数组转为了16进制字符串 */ public static String encodeSHAHex(String data) throws NoSuchAlgorithmException,UnsupportedEncodingException { //return new String(DigestUtils.sha1Hex(data.getBytes(ENCODING))); return new String(DigestUtils.sha256Hex(data.getBytes(ENCODING))); } /** * 测试 * @param args * @throws UnsupportedEncodingException * @throws NoSuchAlgorithmException */ public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException { String data = "找一个好姑娘做老婆是我的梦 想!"; /*************测试encode()**************/ System.out.println("原文-->"+data); byte[] encodedByte = SHACC.encode(data); System.out.println("加密后-->"+encodedByte); byte[] encodedByte2 = SHACC.encode(data); System.out.println("加密后-->"+encodedByte2); for(int i=0;i<encodedByte.length;i++){ System.out.println(encodedByte[i]==encodedByte2[i]); } /*************测试encodeSHAHex()**************/ System.out.println("原文-->"+data); String encodedStr = SHACC.encodeSHAHex(data); System.out.println("加密后-->"+encodedStr); String encodedStr2 = SHACC.encodeSHAHex(data); System.out.println("加密后-->"+encodedStr2); System.out.println(encodedStr.equals(encodedStr2)); } }
在我们需要采用相应的sha算法的时候,只需选用不同的函数即可(具体查询Commons Codec的API即可,链接在第五章末尾)。
jar包的引入参考第二章的第一个例子进行即可,在测试的过程中,自己去试着看看“同一个消息多次进行SHA加密后结果是不是相同”;
在encode()方法的测试中判断两个byte[]是否相等:按索引依次比较两个字节数组中的元素是否相同即可(如果使用main方法去测的话);如果使用Junit,直接使用assertArrayEquals(array1,array2)即可。
第四章 消息摘要算法--SHA的更多相关文章
- 第五章 消息摘要算法--MAC
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第6章“验证数据完整性--消息摘要算法” 5.1.mac(又称为Hmac) 原理:在md与sha系列算法的基础上加入了密钥,是 ...
- 第三章 消息摘要算法--MD5
注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第6章“验证数据完整性--消息摘要算法” 3.1.消息摘要算法:防止消息在传递过程中被篡改. 原理:任何消息经过消息摘要算法后 ...
- storm入门教程 第四章 消息的可靠处理【转】
4.1 简介 storm可以确保spout发送出来的每个消息都会被完整的处理.本章将会描述storm体系是如何达到这个目标的,并将会详述开发者应该如何使用storm的这些机制来实现数据的可靠处理. 4 ...
- MD、SHA、MAC消息摘要算法实现与应用
1.消息摘要概述 消息摘要(Message Digest)又称为数字摘要(Digital Digest).它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生 ...
- 信息加密之消息摘要算法的SHA
SHA是消息摘要算法的一种实现方式,前面已经总结过MD2\4\5的实现,接下来就为大家总结一下SHA的实现. SHA的jdk实现: private static void SHA_JDK(){ try ...
- password学4——Java 加密解密之消息摘要算法(MD5 SHA MAC)
Java 加密解密之消息摘要算法(MD5 SHA MAC) 消息摘要 消息摘要(Message Digest)又称为数字摘要(Digital Digest). 它是一个唯一相应一个消息或文本的固定长度 ...
- MD5 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)
MD5 编辑 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321( ...
- Hash函数和消息摘要算法
一.Hash函数 哈希函数就是能将任意长度的数据映射为固定长度的数据的函数.哈希函数返回的值被叫做哈希值.哈希码.散列,或者直接叫做哈希. 二.消息摘要 将长度不固定的消息(message)作为输 ...
- 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...
随机推荐
- 洛谷P3166 数三角形 [CQOI2014] 数论
正解:数论 解题报告: 传送门! 很久以前做的题了呢,,,回想方法还想了半天QAQ 然后写这题题解主要是因为看到了好像有很新颖的法子,就想着,学习一下趴,那学都学了不写博客多可惜 首先港下最常规的方法 ...
- 从0开始做一个的Vue图片/ 文件选择(上传)组件[基础向]
原文:http://blog.csdn.net/sinat_17775997/article/details/58585142 之前用Vue做了一个基础的组件 vue-img-inputer ,下面就 ...
- git vim 编辑器基本操作
用 git 命令行提交文件时,默认使用 vim 编辑器,基本操作: 按 a, i 或 o 进入编辑模式 按 ESC 进入操作模式 在操作模式下,:wq 为写入退出,:q! 不保存退出
- Netty In Action中文版 - 第三章:Netty核心概念
在这一章我们将讨论Netty的10个核心类.清楚了解他们的结构对使用Netty非常实用.可能有一些不会再工作中用到.可是也有一些非经常常使用也非常核心,你会遇到. Bootstrap ...
- 【剑指offer】替换空格
一.题目: 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. 二.思路: Python代码,先 ...
- 【转】SVM入门(一)SVM的八股简介
(一)SVM的八股简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出许多特有的优势,并能够 ...
- 4.keras实现-->生成式深度学习之用GAN生成图像
生成式对抗网络(GAN,generative adversarial network)由Goodfellow等人于2014年提出,它可以替代VAE来学习图像的潜在空间.它能够迫使生成图像与真实图像在统 ...
- Locust性能测试3-no-web模式和csv报告保存
前言 前面是在web页面操作,需要手动的点start启动,结束的时候也需要手工去点stop,没法自定义运行时间,这就不太方便. locust提供了命令行运行的方法,不启动web页面也能运行,这就是no ...
- 软件包管理:rpm命令管理-校验和文件提取
校验主要用于判断文件是否做了更改 修改标志: 会用-V,会看输出结果即可. 当有误操作,比如删了某一个文件,只需知道他属于哪一个rpm包,可用提取找回覆盖就行.并不把整个rpm包安装,而是提取其中的某 ...
- Linux系统——MySQL基础(三)
### MySQL主从复制实践#### 主从复制实践准备(1)主从复制数据库实战环境准备MySQL主从复制实践对环境的要求比较简单,可以是单机单数据库多实例的环境,也可以是两台服务器,每个机器一个独立 ...