前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring之密码加密

Spring之密码加密

作者头像
爱撒谎的男孩
发布2019-12-31 15:04:24
1.2K0
发布2019-12-31 15:04:24
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

文章目录

  1. 1. 密码加密
    1. 1.1. 消息摘要(数据的指纹)
      1. 1.1.1. 定义
      2. 1.1.2. 作用
      3. 1.1.3. 特性
      4. 1.1.4. 特定的算法
      5. 1.1.5. 实现步骤
        1. 1.1.5.1. 添加依赖jar包
      6. 1.1.6. 测试MD5Hex
    2. 1.2. 密码加密
      1. 1.2.1. 明文
      2. 1.2.2. 密文
    3. 1.3. 实例
      1. 1.3.1. 密码的安全性处理
        1. 1.3.1.1. 实现

密码加密

消息摘要(数据的指纹)

定义

  • 对不固定的消息(字符串,一段文本,一个文件),通过一种特定的算法,得到一个固定长度的文本,固定长度的文本叫做消息摘要
  • 比如我是程序员经过特定的算法之后,得到了消息摘要为:adaf02515dfds7885csdfcdsc

作用

  • 数据完整性的检验技术,我们将文本转换为消息摘要,然后比较消息摘要的值是否相等,如果相等那么表示两种文本相同

特性

  • 不可逆的,不能从消息摘要再得到原来的文本

特定的算法

  1. MD5
  2. SHA

实现步骤

添加依赖jar包
  • commons-codec
代码语言:javascript
复制
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.10</version>
</dependency>

测试MD5Hex

  • 得到的是32位的16进制的字符串
代码语言:javascript
复制
@Test
	public void test1(){
		String str1="你们好,未来的程序员!";
		String strMessageString=DigestUtils.md5Hex(str1);
		System.out.println(strMessageString);
	}
	
//读取文件
	@Test
	public void test2() throws IOException{
		InputStream inputStream=new FileInputStream(new File("/home/chenjiabing/Documents/Blog/AOP.md"));
		String message=DigestUtils.md5Hex(inputStream);
		System.out.println(message);
	}

密码加密

  • 避免在数据库中明文保存密码,通过消息摘要技术对密码进行加密

明文

  • 没有加密的文字(字符串),能看懂的文字

密文

  • 经过加密后的文字(字符串),看不出来明文的意思

### 加盐处理 salt

  • 为了提高密码的安全性
  • 就是在用户的密码之后随便添加一个字符串,然后连接在一起生成摘要,那么即使获取摘要,也不会被破解
代码语言:javascript
复制
@Test
public void test3(){
	String str1="123456";
	String salt="这个是加盐处理";  //需要加盐,随便定义一个字符串
	String message=DigestUtils.md5Hex(str1+salt);  //获取加盐之后的消息摘要
	System.out.println(message);
}

实例

密码的安全性处理

  • 涉及到密码: 登录,注册,修改密码
实现
  • 创建一个MD5Password工具类,用于加密密码
代码语言:javascript
复制
/**
 * 密码加密的类
 * @author chenjiabing
 */
public class MD5Password {
	private final static String SALT="加油,骚年!";  //加盐处理
	
	/**
	 * 获取加密之后的密码
	 * @param password 用户输入的密码
	 * @return  加密之后的密码
	 */
	public static  String getMd5Password(String password){
		return DigestUtils.md5Hex(password+SALT);  //使用了加盐处理
	}
}
  • 在注册的时候对输入的密码进行加密存储到数据库中
代码语言:javascript
复制
/**
	 * 注册
	 * 1. 调用selectUserByUserName(User user)方法判断用户名是否存在,返回对象u
	 * 2. 判断u是否为null,
	 * 3. 如果为null,调用insertUser(user)方法添加
	 * 4. 如果不为null,抛出异常提示controller用户名存在(UserNameAlreadyExistException)
	 */
	public void register(User user) throws UserNameAlreadyExistException {
		User u=userMapper.selectUserByUserName(user.getUsername());  //调用usermapper中的方法
		if (u!=null) {  //如果u不为null,表示用户名已经存在与数据库中,不可以再次注册了,因此抛出异常
			throw new UserNameAlreadyExistException("用户名已经存在,请重新输入!!!");
		}else {   //如果u==null,表示用户名不存在,可以添加
			//获取加密之后的密码
			String md5Password=MD5Password.getMd5Password(user.getPassword());
			//将加密之后的密码设置到user中,保存到数据库中
			user.setPassword(md5Password); 
			userMapper.insertUser(user);  //直接调用持久层方法插入数据即可
		}
	}
  • 在登录的时候,将用户输入的密码进行加密获取到加密之后的密码,然后和数据库中的密码比较
代码语言:javascript
复制
/**
	 * 登录方法
	 * 1. 通过selectUserByUserName返回user对象
	 * 2.判断user是否为null
	 * 3.如果user=null,抛出UserNotFoundException异常
	 * 4.如果user!=null,那么验证其中的密码是否正确
	 * 5.如果密码不匹配,抛出PassWordNotMatchException异常
	 * 6. 如果密码匹配,那么返回user对象
	 * @throws UserNotFoundException 
	 * @throws PassWordNotMatchException 
	 */
	public User login(String userName, String passWord) throws UserNotFoundException, PassWordNotMatchException {
		
		User user=userMapper.selectUserByUserName(userName);  //根据用户名查询,返回user对象
		if (user==null) {   //user为null,表示用户名不存在
			throw new UserNotFoundException("用户名不存在");
		}else {  //如果用户名存在,验证密码
			
			//获取加密之后的密码,实际是一个消息摘要
			String md5Password=MD5Password.getMd5Password(passWord);
			
			//使用加密之后获取的消息摘要和数据库中对应的密码比较
			if (md5Password.equals(user.getPassword())) {  //如果密码匹配
				return user;   //返回user对象即可
			}else {   //如果密码不相同,那么直接抛出密码不匹配的异常即可
				throw new PassWordNotMatchException("密码不匹配");
			}
		}
	}
  • 在修改中,将旧密码加密后和数据库中的密码比较,并且将新密码加密更新到数据库中
代码语言:javascript
复制
/**
	 * 修改密码
	 * 1. 根据id查询用户信息,返回user
	 * 2. 如果user=null,抛出用户不存在的异常
	 * 3. 如果user!=null,比较user中的密码和用户输入的旧密码oldPassword是否相同
	 * 4. 如果密码不相同,抛出密码不匹配的异常
	 * 5. 如果密码相同,表示用户输入的旧密码是正确的,那么更新密码即可 
	 */
	public void updatePassword(Integer id, String oldPassword,
			String newPassword) throws UserNotFoundException, PassWordNotMatchException {
		User user=userMapper.seletUserById(id);  //根据id查询,返回user对象
		if (user==null) {  //如果用户不存在
			throw new UserNotFoundException("当前登录的用户不存在");  //抛出用户不存在的异常
		}else {  //如果当前登录的用户存在
			//获取旧密码的加密之后的密码
			String oldMd5Password=MD5Password.getMd5Password(oldPassword);
			
			//使用加密之后的密码和数据库中的密码比较
			if (!user.getPassword().equals(oldMd5Password)) { //如果返回的user对象中的密码和用户输入的旧密码不匹配
				throw new PassWordNotMatchException("输入的旧密码不匹配");
			}else {  //如果输出的旧密码正确
				User u1=new User();   //创建User对象,封装修改所需的参数
				//获取加密之后的新密码
				String newMd5Password=MD5Password.getMd5Password(newPassword);
				
				u1.setPassword(newMd5Password);  //封装新密码,其中是加密之后的密码
				u1.setId(id);  //封装id
				userMapper.update(u1);  //调用修改的方法
			}
		}	
	}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 密码加密
    • 消息摘要(数据的指纹)
      • 定义
      • 作用
      • 特性
      • 特定的算法
      • 实现步骤
      • 测试MD5Hex
    • 密码加密
      • 明文
      • 密文
    • 实例
      • 密码的安全性处理
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档