前言
本章讲解典型的加密算法SHA(SHA1、SHA256)
方法
1、概念
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
SHA1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦数据处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。
SHA256是SHA2的一种,可产生256位的哈希值,较SHA1更加的安全。
2、SHA1加密原理
我们仍然以单词 China 为例,如何将其进行MD5加密呢?
第一步:首先将China单词转化为ASCII码的十六进制表示方式
China的十六进制为:43 68 69 6E 61
第二步:对得到的数据 4368696E61 进行填充和附加,使其能够被512整除。
对于任意长度的明文,SHA1的明文分组过程与MD5相类似,首先需要对明文添加位数,使明文总长度为448(mod512)位。在明文后添加位的方法是第一个添加位是l,其余都是0。然后将真正明文的长度(没有添加位以前的明文长度)以64位表示,附加于前面已添加过位的明文后,此时的明文长度正好是512位的倍数。与MD5不同的是SHA1的原始报文长度不能超过2的64次方,另外SHA1的明文长度从低位开始填充。
第三步:将得到数据进行拆分,按照512位分块。SHA1有4轮运算,每一轮包括20个步骤(一共80步),最后产生160位摘要。
3、注意事项
与MD5相比,SHA1有以下优缺点:
最显著和最重要的区别是SHA1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA1则是2^160数量级的操作。这样,SHA1对强行攻击有更大的强度。相对的在相同的硬件上,SHA1的运行速度比MD5慢。
但是就目前的情况来看,SHA1也很容易被攻破,为了安全起见,可以选择诸如SHA256,SHA512等高强度的算法来提升安全性。
4、Java实现SHA1加密
package cn.edu.ccut;
import java.security.MessageDigest;
public class SHA1Test {
public static String shaEncode(String inStr) throws Exception {
MessageDigest sha = null;
try {
sha = MessageDigest.getInstance("SHA");
} catch (Exception e) {
System.out.println(e.toString());
e.printStackTrace();
return "";
}
byte[] byteArray = inStr.getBytes("UTF-8");
byte[] md5Bytes = sha.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
public static void main(String args[]) throws Exception {
String str = "China";
System.out.println("SHA1加密前:" + str);
System.out.println("SHA1加密后:" + shaEncode(str));
}
}
运行结果如下: