前言
在应用之间一些重要信息我们可以使用非对称加密和对称加密,相对于破解难度来说,对称加密肯定比较容易破解,非对称加密又无法应用到大量数据的加密,怎样能够实现数据的保护呢?
加密摘要,在信息安全领域,主要涉及两个概念:加密(Encryption)和摘要(Digest)或称为哈希(Hash)。这两个概念在数据处理和存储安全中扮演着不同的角色。
一、摘要(哈希)
摘要是通过散列算法(Hash Algorithm)将任意长度的数据转换成一个固定长度的字符串的过程。这个字符串通常被称为哈希值或消息摘要。摘要的主要特点是:
- 唯一性:不同的输入数据一般会生成不同的摘要。
- 不可逆性:无法从摘要反推出原始数据。这意味着一旦数据被哈希,就无法通过哈希值还原出原始数据。
- 防冲突性:在理论上,找到两个不同输入但具有相同哈希值的情况是极其困难的(尽管在实际中,随着技术的发展,一些旧的哈希算法如MD5已经出现了碰撞漏洞)。
摘要算法常用于验证数据的完整性和真实性。例如,在文件传输过程中,发送方可以计算文件的摘要并将其发送给接收方。接收方在接收到文件后,也会计算文件的摘要,并将计算结果与发送方提供的摘要进行比较。如果两者一致,则说明文件在传输过程中未被篡改。
二、生成信息摘要
C#应用:
/// <summary>
/// 生成摘要信息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
static string GetMd5Hash(string input)
{
using (MD5 md5 = MD5.Create())
{
// 将输入字符串转换为字节数组
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
// 计算哈希值
byte[] hashBytes = md5.ComputeHash(inputBytes);
// 将哈希值转换为字符串
StringBuilder builder = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
builder.Append(hashBytes[i].ToString("x2"));
}
return builder.ToString();
}
}
Java应用:
public class MD5Util {
/**
* 生成md5
*
* @param message
* @return
*/
public static String getMD5(String message) {
String md5str = "";
try {
// 1 创建一个提供信息摘要算法的对象,初始化为md5算法对象
MessageDigest md = MessageDigest.getInstance("MD5");
// 2 将消息变成byte数组
byte[] input = message.getBytes();
// 3 计算后获得字节数组,这就是那128位了
byte[] buff = md.digest(input);
// 4 把数组每一字节(一个字节占八位)换成16进制连成md5字符串
md5str = bytesToHex(buff);
} catch (Exception e) {
e.printStackTrace();
}
return md5str;
}
/**
* 二进制转十六进制
*
* @param bytes
* @return
*/
public static String bytesToHex(byte[] bytes) {
StringBuffer md5str = new StringBuffer();
// 把数组每一字节换成16进制连成md5字符串
int digital;
for (int i = 0; i < bytes.length; i++) {
digital = bytes[i];
if (digital < 0) {
digital += 256;
}
if (digital < 16) {
md5str.append("0");
}
md5str.append(Integer.toHexString(digital));
}
return md5str.toString().toUpperCase();
}
}
我们可以利用该方法生成的摘要,然后对摘要使用RSA加密,这样将原文和加密后的摘要进行传输。当调用端接收到信息后,可以对接收到的摘要进行解密,将解密后的摘要与收到信息生成的摘要对比,就可以判断该数据有没有被篡改。
总结
因为摘要本身是不可逆的,无法直接加密。然而,在实际应用中,人们可能会将摘要与加密技术结合使用来提高安全性。例如,在数字签名过程中,发送方会使用其私钥对消息的摘要进行加密(或称为签名),然后将加密后的摘要(即数字签名)与消息一起发送给接收方。接收方可以使用发送方的公钥对数字签名进行解密(或称为验证),并重新计算消息的摘要以验证消息的完整性和真实性。这样,即使消息在传输过程中被篡改,接收方也能通过比较解密后的摘要和重新计算的摘要来发现这一点。