梦入琼楼寒有月,行过石树冻无烟

Spring security 密码加密

在注册的过程中,通常会有一定的入库处理机制,以钟山计算机端口安全联合众测平台为例,密码入库时都是由MD5运算加密后的密文,以防止不法分子通过相关技术手段对站点进行脫库时明文密码的直接获取。通过使用密文给不法分子增加技术难度从而留有一定的解密时间来提醒用户尽快修改密码等公告的发布与通知。在目前,我们通常会使用MD5、SHA等摘要算法,尽管有很多在线解密的站点,通常在密码加密的场景中,我们会将用户输入的明文密码进行MD5或HAS运算后存储到数据库,之后在用户登录的时候将数据和数据库中的data进行对比的这种方案。

密文的解密方式

通常我们可通过碰撞,即存在两个甚至多个得到同一直的情况下就会存在被碰撞的可能性。当然还有就是最直接的方法构建一张反查表,就是说将密码经过md5后运算出的直来进行穷举,如果该站点数据库中有部分密码和反查表中大部分数据收录,则很容易被进行破解至明文。在或者还有一种非常暴力的方式则是“暴力破解”,主要依靠的是强大的字典而不是使用者的技术实力,按照道理来讲,只要你的字典足够丰富且完善,成功率就越高,如果你的字典跑完了还没有破解成功的话,那基本上是意味着失败了。

彩虹表

起初黑客们通过字典、碰撞的方式进行破解,对于简单的密码则非常有用,但是如果遇到复杂的密码和密码系统,就会产生较大的字典,为了解决逆向破解的难题,并增加表的容量,瑞士洛桑联邦技术学院的Philippe Oechslin就提出了一种优化型的时间与内存交换算法。

这让表不在是只存储米嗯问与密文的一一对应关系,而是一个密码对的集合,并在有限的内存中以极高的效率破解更多可能的密码,这也被一些黑客改进了部分流程,最后成为了一种彩虹表。

彩虹表的大小通常都超过了100g以上,彩虹表每一条散列链都会代表一组相同特征的铭文,但每一条散列链并不需要完整的存储,仅仅存储开始节点和结束节点即可。例如图中的H则代表一次散列计算,R1\R2\R3代表一次递归性质的约减计算R旁边的字母则会代表一条散列链会经历3次约减,也就是说这条散列链可以携带三条铭文,后面的都会由K所指代。当我们需要破解一个散列的时候,只需要对其做相应的约减计算,便可以推导出其所在的散列链,再有散列链正推就可能会得到该散列链的明文,由于K的存在,所以可以携带更多的数据。虽然彩虹表看似如此强大,但是如果当遇到被加盐的时候,也是会变得弱不禁风的。

实现密码加密

UserServiceImpl.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.example.zhongce.service;
import com.example.zhongce.model.User;
import com.example.zhongce.repository.RoleRepository;
import com.example.zhongce.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.HashSet;

@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;

@Autowired
private RoleRepository roleRepository;

@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;

@Override
public void save(User user) {
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
user.setRoles(new HashSet<>(roleRepository.findAll()));
userRepository.save(user);
}

@Override
public User findByUsername(String username) {
return userRepository.findByUsername(username);
}
}

具体代码可通过阅读或浏览钟山计算机端口安全联合众测平台进行得知:https://gitee.com/zhongshan_union/Zhongshan-computer-port-security-joint-public-testing-platform/blob/master/src/main/java/com/example/zhongce/service/UserServiceImpl.java

⬅️ Go back