安全算法 - 摘要算法
安全算法 - 摘要算法
文章目录
- 安全算法 - 摘要算法
- 一:摘要算法概述
- 二:MD5 摘要算法
- 三:SHA1摘要算法
一:摘要算法概述
简介
- 摘要算法属于哈希散列加密算法
- 消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密
- 只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文
- 消息摘要算法主要应用在“数字签名”领域,作为对明文的摘要算法
- 著名的摘要算法有
RSA
公司的MD5
算法和SHA-1
算法及其大量的变体
特点
-
无论输入的消息有多长,计算出来的消息摘要的长度总是固定的
-
消息摘要看起来是“伪随机的”。也就是说对相同的信息求摘要结果相同
-
消息轻微改变生成的摘要变化会很大
-
只能进行正向的信息摘要,而无法从摘要中恢复出任何的消息,甚至根本就找不到任何与原信息相关的信息(单向性)
二:MD5 摘要算法
md5摘要算法具有如下特性
压缩性 : 任意长度的数据,算出的MD5
值长度都是固定的(32
位16
进制)。
容易计算 : 从原数据计算出MD5
值很容易。
抗修改性 : 对原数据进行任何改动,哪怕只修改1
个字节,所得到的MD5
值都有很大区别。
强抗碰撞 : 已知原数据和其MD5
值,想找到一个具有相同MD5
值的数据(即伪造数据)是非常困难的
// java实现MD5加密算法
import java.security.MessageDigest;
public class MD5Demo {
public static void main(String[] args) {
System.out.println(getMD5Code("你若安好,便是晴天"));
}
// md5加密
public static String getMD5Code(String message) {
String md5Str = "";
try {
//创建MD5算法消息摘要
MessageDigest md = MessageDigest.getInstance("MD5");
//生成的哈希值的字节数组
byte[] md5Bytes = md.digest(message.getBytes());
// 转换成为16进制
md5Str = bytes2Hex(md5Bytes);
}catch(Exception e) {
e.printStackTrace();
}
return md5Str;
}
// 2进制转16进制
public static String bytes2Hex(byte[] bytes) {
StringBuffer result = new StringBuffer();
int temp;
try {
for (int i = 0; i < bytes.length; i++) {
temp = bytes[i];
if(temp < 0) {
temp += 256;
}
if (temp < 16) {
result.append("0");
}
result.append(Integer.toHexString(temp));
}
} catch (Exception e) {
e.printStackTrace();
}
return result.toString();
}
}
三:SHA1摘要算法
对于长度小于2^64位的消息,SHA1
会产生一个160
位(40
个字符)的消息摘要。
当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。
在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。
SHA1
有如下特性:
- 不可以从消息摘要中复原信息(不可逆性)
- 两个不同的消息不会产生同样的消息摘要,(但会有1x1048分之一的机率出现相同的消息摘要,一般使用时忽略)
// java实现SHA1算法
package com.snailclimb.ks.securityAlgorithm;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SHA1Demo {
public static void main(String[] args) {
System.out.println(getSha1("你若安好,便是晴天"));
}
public static String getSha1(String str) {
if (null == str || 0 == str.length()) {
return null;
}
char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
try {
//创建SHA1算法消息摘要对象
MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
//使用指定的字节数组更新摘要。
mdTemp.update(str.getBytes("UTF-8"));
//生成的哈希值的字节数组
byte[] md = mdTemp.digest();
//SHA1算法生成信息摘要关键过程
int j = md.length;
char[] buf = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
return new String(buf);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "0";
}
}