项目中常用技术一:MD5
1.MD5
1.1什么是MD5?
MD5(Message Digest Algorithm 5),消息摘要算法第五版。
消息摘要算法又称为哈希算法、散列算法,输出的消息摘要又称为哈希值、散列值。
1.2MD5的特点
- 压缩性:MD5可以将任意长度的输入转化为128位长度的输出;
- 不可逆性:MD5是不可逆的,我们无法通过常规方式从MD5值倒推出它的原文;
- 抗修改性:对原文做一丁点儿改动,MD5值就会有巨大的变动,也就是说就算两个MD5值非常相似,你也不能想当然地认为它们俩对应的原文也非常相似。
- 容易计算:从原数据计算出MD5值很容易。
1.3MD5的问题
因为MD5是不可逆的,所以MD5是安全的。但是2004年,山东大学的王小云教授在美国加州举办的密码学会议上宣布破解了MD5,其实并不是真正的破解,而是非常明显地加快了反向查询的速度,在当时计算机的计算能力下,利用她们的技术,可以在几个小时内就找到一个MD5值对应的原文。因为MD5可以被暴力破解,所以MD5不再是安全的了,对安全性要求较高的场合,不建议直接使用MD5。
1.4MD5的应用场景
1.4.1 对密码加密
MD5可以用来对密码加密,防止密码被窃听。
- 为什么要对密码加密
比如一个用户的用户名为18666666666,密码为123456,那么如果不对密码加密,客户端在注册或登录的时候,就是明文传输密码http://localhost:8080/hw/register|login?username=18666666666&password=123456
,传输过程中一旦请求被截获,用户的密码就被泄漏了;再者服务器的数据库中也是明文存储密码
username | password |
---|---|
18666666666 | 123456 |
一旦数据库泄漏,用户的密码就被泄漏了。
而如果我们使用了MD5对密码加密,客户端在注册或登录的时候,就是密文传输密码http://localhost:8080/hw/register|login?username=18666666666&password=e10adc3949ba59abbe56e057f20f883e
,传输过程中即便请求被截获,用户的密码也不会被泄漏;再者服务器的数据库中也是密文存储密码
username | password |
---|---|
18666666666 | e10adc3949ba59abbe56e057f20f883e |
就算数据库泄漏,用户的密码也不会被泄漏。
- 彩虹表
攻击者创建了一个叫彩虹表的东西,它是一个非常庞大的数据库,里面收集了所有常用的密码,以及这些密码对应的MD5值、SHA-1值等,现在主流的彩虹表记录数据约90万亿条,占用硬盘超过500TB。有了彩虹表,攻击者就可以通过穷举法反向查询出MD5值、SHA-1值等对应的原文,因此如果你的密码很不幸被搜集在彩虹表里,就可能被破解掉,这也是为什么很多场合我们输密码的时候,有字母数字下划线大小写等乱七八糟各种要求,目的就是尽量使得明文密码的复杂度增加一些,尽量使得明文密码及其MD5值、SHA-1值等不被收集在彩虹表里。
如果有一个预先计算好的常用口令和它们的 MD5的对照表(如下表),那么通过查表方式,时间上将大大减少,而这个表就叫做彩虹表:
常用口令 | MD5 |
---|---|
hello123 | f30aa7a662c728b7407c54ae6bfd27d1 |
12345678 | 25d55ad283aa400af464c76d713c07ad |
passw0rd | bed128365216c019988915ed3add75fb |
19700101 | 570da6d5277a646f6552b8832012f5dc |
… | … |
20201231 | 6879c0ae9117b50074ce0a0d4c843060 |
- 加盐Sault
可见直接使用MD5加密是不安全的,但是我们可以加盐。加盐是指在密码的任意位置插入一些指定的字符串(即盐值salt),加盐的目的也是为了尽量增强明文密码的复杂度,尽量使得明文密码及其MD5值、SHA-1值等不被收集在彩虹表里。
加盐流程:
- 用户注册时
- 用户输入【账号】和【密码】(以及其他用户信息);
- 系统为用户生成【Salt值】;
- 系统将【Salt值】和【用户密码】连接到一起;
- 对连接后的值进行散列,得到【Hash1值】;
- 将【Hash1值】和【Salt值】分别放到数据库中。
- 用户登录时
用户输入【账号】和【密码】;
系统通过用户名找到与之对应的【Hash值】和【Salt值】;
系统将【Salt值】和【用户输入的密码】连接到一起;
对连接后的值进行散列,得到【Hash2值】(注意是即时运算出来的值);
比较【Hash1值】和【Hash2值】是否相等,相等则表示密码正确,否则表示密码错误。
1.4.2 生成数字签名
MD5可以用来生成数字签名,验证数据是否被篡改。
1.5MD5是是对称加密还是非对称加密?
小羊在昨天2023.5.19下午等了将近十多分钟面试官才进面试,结果面试官问我MD5,我当时一脸懵逼,只听他说MD5是一个非对称加密算法,我当时信以为真。我就去总结MD5相关的知识,结果发现面试官说错了。话不多说,直接发车!
在计算机信息安全领域,经常应用到MD5、对称加密、非对称加密。在密码学的应用和研究中,DES、RSA、SHA等加密算法占据着重要的位置。随着人们对加密强度需求的不断提高,近期出现了很多加密算法,如AES、ECC等。那么,哪些算法是对称加密,哪些是非对称加密;对称加密和非对称加密有哪些优缺点,MD5是对称加密还是非对称加密?
我们先来了解一下加密算法的基础北背景。
1.5.1对称加密算法有哪些?
对称密码算法又叫传统密码算法,也就是加密密钥能够从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加密解密密钥是相同的。常见的对称加密算法有:DES、IDEA、AES、SM1和SM4。
1.5.2非对称加密算法有哪些?
非对称密钥也叫公开密钥加密,它是用两个数学相关的密钥对信息进行编码。在此系统中,其中一个密钥叫公开密钥,可随意发给期望同密钥持有者进行安全通信的人。公开密钥用于对信息加密。第二个密钥是私有密钥,属于密钥持有者,此人要仔细保存私有密钥。密钥持有者用私有密钥对收到的信息进行解密。常见的非对称加密算法有:RSA、ECC、SM2。
1.5.3MD5是对称加密还是非对称加密?
这个问题有人吐槽过,面试官竟然问MD5是对称加密还是非对称加密?其实,MD5不是加密算法,md5实际上既不是对称算法,也不是非对称加密算法。它是消息摘要(安全散列)算法。
俺也要吐槽一下。
1.5.4对称加密和非对称加密有哪些优缺点?
对称加密优点:速度快,对称性加密通常在消息发送方需要加密大量数据时使用,具有算法公开、计算量小、加密速度快、加密效率高的特点。对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性。
对称加密的缺点:密钥的管理和分发非常困难,不够安全。在数据传送前,发送方和接收方必须商定好秘钥,并且双方都要保存好密钥,如果一方的密钥被泄露,那么加密信息也就不安全了,安全性得不到保证。
非对称加密优点:安全性更高,公钥是公开的,秘钥是自己保存的,不需要将私钥给别人。
非对称加密缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
2.BeanUtils
BeanUtils是深拷贝,还是浅拷贝?
BeanUtils.copyProperties是浅拷贝。
浅拷贝:只是调用子对象的set方法,并没有将所有属性拷贝。(也就是说,引用的一个内存地址)
浅拷贝对于基本数据类型就是直接进行值传递,在内存的另一个空间内存放,修改这个值不会影响到拷贝源的值
浅拷贝对于引用数据类型就是进行的是地址传递,并没有对该对象重新开辟一个内存空间进行存放,所以对于引用数据类型的浅拷贝就相当于两个引用指向了同一个内存地址
深拷贝:将子对象的属性也拷贝过去。
深拷贝就是将目标对象的属性全部复制一份给源对象,复制完之后他们就是隔开的,没有任何关系,无论操作源对象还是目标对象都对另一个没有影响
无论是浅拷贝还是深拷贝,对于基本类型和String来说都是没有影响的,有影响的只有引用类型数据。
什么情况适合用BeanUtils?
如果都是单一的属性,那么不涉及到深拷贝的问题,适合用BeanUtils。