数字签名,信息加密是前后端开发经常使用的技术。应用场景包括:用户登录,交易,信息通讯等。
MD5
- MD5的全称是
Message-Digest Algorithm 5
(信息-摘要算法),经MD2、MD3和MD4发展而来。 - MD5,用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。
- 将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。
MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。
SHA
- SHA全称是Secure Hash Algorithm,安全散列算法
- 安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。
- 对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。
- 该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。
- 散列函数值可以说是对明文的一种"指纹"或是"摘要",所以对散列值的数字签名就可以视为对此明文的数字签名。
MD5和SHA区别
因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同
1.对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
2.对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
3.速度:在相同的硬件上,SHA-1的运行速度比MD5慢。
MD5和SHA1的应用场景
MD5和SHA1的信息摘要及不可逆的特性
- 密码验证:服务器端存储用户密码加密后的内容,每次密码校验比较的是密文是否相同,确保服务器管理员也无法获取到用户使用的密码。
- 文件的完整性比较:当下载一个文件时,服务器返回的信息中包括这个文件的MD5(或者SHA1),在本地下载完毕将其进行MD5加密,之后比较两个MD5只进行比较,如果一直则说明文件完整不存在丢包现象。
- 文件上传:在上传文件信息的时候,将该文件的MD5同时上传给服务器。服务器中存储了这个文件MD5,并存储这个MD5只对应的已上传的字节长度,比如未上传为0,已完成为-1,已上传200自己,则值为200。可以用于匹配该文件在服务器中的状态,方便断点再传。只要源文件没有改,就算文件改了名字,换个账户都可以在服务器中找到对应的文件,避免存储多份相同文件,并可以提高二次上传时的速度。
- 版权验证:当一个视频或者音创作出来的时候他的MD5是唯一的,翻录过后的版本的MD5会不同,可以用于版权验证。
数字签名
- 数字签名,简单来说就是通过提供可鉴别的数字信息, 验证自身身份的一种方式。
- 一套数字签名,通常定义两种互补的运算,一个用于签名,另一个用于验证。
- 分别由发送者持有能够代表自己的私钥,由接受者持有的与私钥对应的公钥,能够在接受到来自发送者信息时候用于验证其身份。
加密
数据加密 基本过程,就是对来的明文的文件或者数据 按照 某种算法 进行处理,使其成为不可读的一段代码,通常成为 “密文”。通过这样的途径,来达到保护数据 不被别人 非法窃取,阅读的目的。
解密
加密的逆过程为解密,将 编码的信息 转为为 原有的数据 的过程。
对称加密和非对称加密
常见的对称加密算法:DES,3DES,AES等
常见的非对称加密算法:RSA,DSA等
对称加密(共享密钥加密算法)
在对称加密算法中,使用的密钥只有一个
,发送者 和 接受者 双方都是用这一个密钥进行 加密 和 解密。这就要求通信双方都必须事先知道这个密钥。
非对称加密算法(公开密钥加密算法)
在非对称加密算法中,她需要两个密钥,一个称为公开密钥,另一个为私有密钥
。因为加密和解密使用的密钥不同,所以称为非对称加密算法。
如果使用公钥对数据进行加密,只有用对应的私钥才可以对其进行解密。
如果使用私钥对数据进行加密,只有用对应的公钥才可以对其进行解密。
代码实现
md5,sha1摘要算法
import cn.hutool.crypto.SecureUtil;
private static void md5(){
String s = "我是中国人";
System.out.println(SecureUtil.md5(s));
}
private static void sha1(){
String s = "我是中国人";
System.out.println(SecureUtil.sha1(s));
}
rsa非对称算法
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import org.apache.commons.codec.binary.Base64;
import java.security.KeyPair;
public class RSAUtil {
private static final String publicKey;
private static final String privateKey;
static {
KeyPair pair = SecureUtil.generateKeyPair("RSA");
publicKey = new String(Base64.encodeBase64(pair.getPublic().getEncoded()));
privateKey= new String(Base64.encodeBase64((pair.getPrivate().getEncoded())));
}
public static String encrypt(String str){
return SecureUtil.rsa(privateKey,publicKey).encryptBcd(str, KeyType.PrivateKey);
}
public static String decrypt(String str){
return SecureUtil.rsa((String) null,publicKey).decryptStrFromBcd(str, KeyType.PublicKey);
}
public static void main(String[] args) {
System.out.println("publicKey:"+publicKey);
System.out.println("privateKey:"+privateKey);
String encryptStr = encrypt("{\"info\":\"admin\"}");
System.out.println(encryptStr);
System.out.println(decrypt(encryptStr));
}
}