数字签名,信息加密是前后端开发经常使用的技术。应用场景包括:用户登录,交易,信息通讯等。
Message-Digest Algorithm 5(信息-摘要算法),经MD2、MD3和MD4发展而来。MD5算法具有以下特点:
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
5、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。
MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1、RIPEMD以及Haval等。
因为二者均由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的信息摘要及不可逆的特性
数据加密 基本过程,就是对来的明文的文件或者数据 按照 某种算法 进行处理,使其成为不可读的一段代码,通常成为 “密文”。通过这样的途径,来达到保护数据 不被别人 非法窃取,阅读的目的。
加密的逆过程为解密,将 编码的信息 转为为 原有的数据 的过程。
常见的对称加密算法: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));
}
}