消息摘要算法-SHA算法实现

简述

SHA算法分为一代和二代,这个是美国安全局发布的一系列的密码散列算法。

基于如下两点安全理由:

1、从消息摘要反推输入信息,从计算理论上来说很困难

2、想找到两组不同的消息对应到相应的消息摘要,从计算理论上来说一额很困难。对任何消息的变动,都有很高几率产生消息摘要迥异

 

不过这个算法已经不安全了,被中国的教授破解了。这个技术通常用来做数字签名。常见的就是B2B,B2C网站的支付。数据post到支付中心的时候,是发送一些加密串,同时带上签名。而这个签名可以被伪造。所以就不安全了。

 


常见的使用模型

1、甲方发布消息摘要算法(就是指定用哪个算法做消息摘要处理),然后对要发布的消息做摘要处理

2、甲方将消息以及消息摘要信息(这里大家通常叫摘要信息为数字指纹)发送给乙方

3、乙方接收后,用甲方指定的消息摘要算法,对消息进行摘要处理,然后比对是否和发送过来的消息摘要相同。以甄别消息真假

 

先让我们用sun本身的jdk6的代码展示下sha的消息摘要算法

package com.ca.test;
import java.security.MessageDigest;
/**
 * 下边都是sun java6支持的消息摘要算法 
 * 进行sha的消息摘要算法处理
 * @author kongqz
 * */
public class SHACoder {
	/**
	 * SHA-1消息摘要
	 * @param 待处理的消息摘要
	 * @author kongqz
	 * 
	 * **/
	public static byte[] encodeSHA(byte[] data) throws Exception{

		//初始化MessageDisgest
		MessageDigest md= MessageDigest.getInstance("SHA");

		return md.digest(data);
	}
	/**
	 * SHA-256消息摘要
	 * @param 待处理的消息摘要
	 * @author kongqz
	 * 
	 * **/
	public static byte[] encodeSHA256(byte[] data) throws Exception{

		//初始化MessageDisgest
		MessageDigest md= MessageDigest.getInstance("SHA-256");

		return md.digest(data);
	}

	/**
	 * SHA-384消息摘要
	 * @param 待处理的消息摘要
	 * @author kongqz
	 * 
	 * **/
	public static byte[] encodeSHA384(byte[] data) throws Exception{

		//初始化MessageDisgest
		MessageDigest md= MessageDigest.getInstance("SHA-384");

		return md.digest(data);
	}

	/**
	 * SHA-512消息摘要
	 * @param 待处理的消息摘要
	 * @author kongqz
	 * 
	 * **/
	public static byte[] encodeSHA512(byte[] data) throws Exception{

		//初始化MessageDisgest
		MessageDigest md= MessageDigest.getInstance("SHA-512");

		return md.digest(data);
	}
	public static void main(String[] args) throws Exception {
		String str="java支持的SHA 消息摘要算法";
		System.out.println("原文:"+str);
		byte[] data1=SHACoder.encodeSHA(str.getBytes());
		System.out.println("SHA/SHA1的消息摘要算法值:"+data1.toString());

		byte[] data2=SHACoder.encodeSHA256(str.getBytes());
		System.out.println("SHA-256的消息摘要算法值:"+data2.toString());

		byte[] data3=SHACoder.encodeSHA384(str.getBytes());
		System.out.println("SHA-384的消息摘要算法值:"+data3.toString());

		byte[] data4=SHACoder.encodeSHA512(str.getBytes());
		System.out.println("SHA-512的消息摘要算法值:"+data4.toString());
	}
}
控制台输出结果:
原文:java支持的SHA 消息摘要算法
SHA/SHA1的消息摘要算法值:[B@1fb8ee3
SHA-256的消息摘要算法值:[B@14318bb
SHA-384的消息摘要算法值:[B@1a758cb
SHA-512的消息摘要算法值:[B@69b332

另外Commons codec也提供了对于SHA算法的实现。涵盖了java6所支持的全部的SHA算法。可以参考下DigestUtils类相关SHA算法支持API.commons codec与sun提供的算法无本质差别。只是提供了更加方便的实现

 

通过如上的实验,大家可以看到不同的消息摘要算法长度不同。

 

同时能总结如下:

 

1、sun提供了底层的sha算法实现,缺少sha-224算法,而且无法做进制转换

2、bouncy castle对sun进行了补充,提供了sha-224算法以及16进制的字符串的摘要信息,比较方便

3、commons codec对sun的sha算法可以进行包装,并且支持十六进制字符串形式的摘要信息,相当方便。

 

如果只是想用sha算法,不想用sha224算法支持。commons codec是不错选择。

想加16进制支持,就结合bouncycastle或者commons codec吧

时间: 2024-10-26 08:43:48

消息摘要算法-SHA算法实现的相关文章

消息摘要算法-MAC算法系列

一.简述   mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥.因此MAC算法也经常被称作HMAC算法.关于hmac算法的详情可以参看RFC 2104(http://www.ietf.org/rfc/rfc2104.txt),这里包含了HmacMD5算法的C语言实现.   这里需要说明的是经过mac算法得到的摘要值也可以使用十六进制编码表示,其摘要值得长度与实现算法的摘要值长度相同.例如

消息摘要算法-bouncy castle支持的MD4算法扩展

sun本身支持MD2和MD5,但是缺少进制转换与支持   bouncy castle对sun进行支持补充,提供了对MD4的算法,同时对十六进制转换提供了支持.   commons codec 只是针对MD5支持,并且支持16进制   但是大部分场景下我们都是使用MD5,毕竟MD5是经过MD4改良进来了.不过也有场景可能会用到MD4.那我们就将MD4消息摘要处理的代码展示下: package com.ca.test; import java.security.MessageDigest; impo

Python和GO语言实现的消息摘要算法示例_python

常用的消息摘要算法有MD5和SHA,这些算法在python和go的库中都有,需要时候调用下就OK了,这里总结下python和go的实现. 一.python消息摘要示例 代码如下: 复制代码 代码如下: #! /usr/bin/python '''       File      : testHash.py       Author    : Mike       E-Mail    : Mike_Zhang@live.com ''' import hashlib src = raw_input(

常用的消息摘要算法小总结

今天偶然的学习了一下几种关于消息摘要算法的知识.个人觉得很好.应着老话"好记性不如烂笔头",我就码了几行代码咯. 算法嘛,没什么好说的了.毕竟是设计者智慧与汗水的结晶,也是时代进步的推动力.我们能做的就是将这种算法运用得当,造福全人类,就行了! //格外需要注意的是采用CC(Commons codec)方式生成消息摘要时,一定要记得导入相关的jar包哦! MD方式 package MD; /** * MD:MessageDigest----消息摘要算法 */ import java.s

信息摘要算法-RipeMD以及HmacRipeMD算法

一.简述   除了MD.SHA和MAC三大主流信息摘要算法之外,还有一些不常见的消息摘要算法.包括RipeMD系列.Tiger.Whirlpool和Gost3411算法.同时,RipeMD算法和MAC算法系列相结合,有产生了HmacRipeMD128和HmacRipeMD160两种算法.   针对这些算法进行简单介绍   1.RipeMD算法:针对MD4和MD5算法缺陷分析提出的算法.这些算法主要是针对摘要值得长度进行了区分   2.Tiger算法:号称最快的Hash算法,专门针对64为机器做优

Instagram 动态消息开始导入演算法,不再依发布时间排列

Instagram 官方 曾宣布,计划将演算法导入动态消息,使贴文产生新的排序方式,优先显示用户所关注的动态,不再依发布时间排列.虽然引发不满,但这一天终究会到来,这项重大措施已从 6 月 2 日起逐步向全球用户开放. 过去 Instagram 依发布时间排列,若用户肯花时间浏览,几乎不会错过任何一则贴文.不过,官方统计用户们平均错过 70% 的动态消息,当这个俗称 IG 的照片社交不断扩张.用户乐于订阅各式各样的帐号,官方认为大家更难掌握重要的动态. 官方早已计划为动态消息导入演算法,产生新的

Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC

 加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     如基本的单向加密算法:  BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMAC(Hash Message Authentication Cod

java基础---->摘要算法的介绍 (转)

数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名.数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密.数据摘要算法也被称为哈希(Hash)算法.散列算法.今天,我们就开始java中摘要算法的学习.   项目结构如下: SHA算法 安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algor

JAVA MessageDigest MD5 SHA

 MD5是常用的加密算法,也经常用于校验信息完整,如文件的完整性.用术语讲,MD5是一种消息摘要算法(Message Digest Algorithm).另外还有一种常用的消息摘要算法SHA1.如果想了解这些的话,可以去百度百科:MD5.SHA1.消息摘要算法.            Java已经实现了MD5.SHA1算法.利用java.security.MessageDigest类就可以获取字符串和文件的MD5以及SHA1结果. 1.字符串的MD5(下面的代码有详细注释) public sta