什么是加解密应该不用解释了吧
加密(encryption):就是把一段明文(你不想让别人看到的内容)变成密文(和你发过来的明文八竿子打不着),这就是加密
解密(Decrypt)就是加密的相反过程,你把明文加密了,那么接受者肯定得知道你到底发过来什么内容了,不然加密就没有意义了
加解密密钥:就是你用什么字符串进行的加密,解密就正好相反
参照链接
加密总可以分为两种,一种是对称加密, 一种是非对称加密,对称加密也就是说加密和解密密钥相同,而非对称加密就是说加解密密钥不相同。
常见的加密算法
对称加密 算法主要有 DES、3DES、AES 等,
非对称算法 主要有 RSA(Https)、DSA 等
上面两个都是可逆的
散列算法 主要有 SHA-1、MD5 等(不可逆,一般用于签名)
Hutool官网
首先引入pom依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.1.2</version>
</dependency>
@Test
public void testAES() throws IOException {
String content = "test中文";
//随机生成密钥
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
//构建,这一步相当于将密钥与加密对象绑定
AES aes = SecureUtil.aes(key);
//加密
byte[] encrypt = aes.encrypt(content);
//解密
byte[] decrypt = aes.decrypt(encrypt);
Console.log(encrypt);
Console.log(decrypt);
//加密为16进制表示
String encryptHex = aes.encryptHex(content);
//解密为原字符串
String decryptStr = aes.decryptStr(encryptHex);
System.out.println(encryptHex);
System.out.println(decryptStr);
}
public void testDES() throws IOException {
String content = "test中文";
//随机生成密钥
byte[] key = SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue()).getEncoded();
//构建
DES des = SecureUtil.des(key);
//加密解密
byte[] encrypt = des.encrypt(content);
byte[] decrypt = des.decrypt(encrypt);
//加密为16进制,解密为原字符串
String encryptHex = des.encryptHex(content);
String decryptStr = des.decryptStr(encryptHex);
}
MD5(Message-Digest Algorithm 5)加密是一种不可逆的加密规则,用于确保信息的完整。它可以使数据信息在数字签名软件签署私人秘钥前呗压缩成一种保密的格式,这是一串十六进制数字。
任意长度的数据经过MD5加密后得到的值的长度都是固定的,并且对原数据修改一个字符对于加密后的值都有很大的变动。
@Test
public void testMD5(){
MD5 md5 = SecureUtil.md5();
String digest = md5.digestHex("123");
System.out.println(digest);
}
如果还没明白在补充一下
大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为公安机关鉴别罪犯身份最值得信赖的方法;
与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,
如果任何人对文件名做了任何改动,其MD5值也就是对应的“数字指纹”都会发生变化。
我们常常在某些软件下载站点的某软件信息中看到其MD5值,
它的作用就在于我们可以在下载该软件后,对下载回来的文件用专门的软件(如Windows MD5 Check等)做一次MD5校验,
以确保我们获得的文件与该站点提供的文件为同一文件。利用MD5算法来进行文件校验的方案被大量应用到软件下载站、
论坛数据库、系统文件安全等方面。
MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。
举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
MD5还广泛用于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方。
如在UNIX系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,
系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确
。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。
这可以避免用户的密码被具有系统管理员权限的用户知道。MD5将任意长度的“字节串”映射为一个128bit的大整数,
并且是通过该128bit反推原始字符串是困难的,换句话说就是,即使你看到源程序和算法描述,
也无法将一个MD5的值变换回原始的字符串,
从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。
所以,要遇到了md5密码的问题,比较好的办法是:你可以用这个系统中的md5()函数重新设一个密码,
如admin,把生成的一串密码的Hash值覆盖原来的Hash值就行了。
正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为"跑字典"的方法。
有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,
先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。
我们假设密码的最大长度为8位字节(8 Bytes),同时密码只能是字母和数字,共26+26+10=62个字符,
排列组合出的字典的项数则是P(62,1)+P(62,2)….+P(62,8),
那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘阵列,而且这种方法还有一个前提,
就是能获得目标账户的密码MD5值的情况下才可以。这种加密技术被广泛的应用于UNIX系统中,
这也是为什么UNIX系统比一般操作系统更为坚固一个重要原因。
跟MD5一样也是签名算法
@Test
public void testSHA1(){
Digester sha1 = SecureUtil.sha1();
System.out.println(sha1.digestHex("SHA1加密"));
}
非对称加密算法
RSA 加密算法是目前最有影响力的 公钥加密算法,并且被普遍认为是目前 最优秀的公钥方案 之一。RSA 是第一个能同时用于 加密 和 数字签名 的算法,它能够 抵抗 到目前为止已知的 所有密码攻击,已被 ISO 推荐为公钥数据加密标准。
RSA 加密算法 基于一个十分简单的数论事实:
将两个大 素数 相乘十分容易,但想要对其乘积进行 因式分解 却极其困难,因此可以将 乘积 公开作为 加密密钥。
Hutool进行RSA加密
code
@Test
public void testRSA(){
RSA rsa = SecureUtil.rsa();
byte[] encrypt = rsa.encrypt("这是明文","UTF-8", KeyType.PublicKey);
byte[] de = rsa.decrypt(encrypt, KeyType.PrivateKey);
System.out.println(new String(de));
//获得私钥
rsa.getPrivateKey();
rsa.getPrivateKeyBase64();
//获得公钥;
rsa.getPublicKey();
rsa.getPublicKeyBase64();
//公钥加密,私钥解密
byte[] encrypt1 = rsa.encrypt(StrUtil.bytes("我是一段测试aaaa", CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey);
byte[] decrypt2 = rsa.decrypt(encrypt1, KeyType.PrivateKey);
String s = new String(decrypt2);
System.out.println("明文" +s);
}
ECC 也是一种 非对称加密算法,主要优势是在某些情况下,它比其他的方法使用 更小的密钥,比如 RSA 加密算法,提供 相当的或更高等级 的安全级别。不过一个缺点是 加密和解密操作 的实现比其他机制 时间长 (相比 RSA 算法,该算法对 CPU 消耗严重)。
…