热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类

文章目录前言一、密码工具类PasswordUtils二、密码编码类PasswordEncoder三、测试类前言一般测试、写demo时用户注册的用户名和密码保存到数据库中都是以明文的

文章目录

  • 前言
  • 一、密码工具类PasswordUtils
  • 二、密码编码类PasswordEncoder
  • 三、测试类


前言
  • 一般测试、写demo时用户注册的用户名和密码保存到数据库中都是以明文的形式保存的,其实这是不安全的。密码是需要进行加密的,比如md5或者SHA加密方式。

  • 又因为密码明文相同时可能导致有相同的密文,为了避免密码密文一致,则又进行了 加盐验证。使得即使明文密码相同,密码的密文也不同。


一、密码工具类PasswordUtils

package com.feng.utils;import java.util.UUID;/**
* @ClassName: PasswordUtils
* 密码工具类
* @Author: 小冯
* @CreateDate: 2019/9/7 13:44
* @UpdateUser: 小冯
* @UpdateDate: 2019/9/7 13:44
* @Version: 0.0.1
*/

public class PasswordUtils {/*** 匹配密码* @param salt 盐* @param rawPass 明文* @param encPass 密文* @return*/public static boolean matches(String salt, String rawPass, String encPass) {return new PasswordEncoder(salt).matches(encPass, rawPass);}/*** 明文密码加密* @param rawPass 明文* @param salt* @return*/public static String encode(String rawPass, String salt) {return new PasswordEncoder(salt).encode(rawPass);}/*** 获取加密盐* @return*/public static String getSalt() {return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 20);}
}

二、密码编码类PasswordEncoder

package com.feng.utils;import java.security.MessageDigest;/**
* @ClassName: PasswordEncoder
* 密码加密
* @Author: 小霍
* @CreateDate: 2019/9/7 13:45
* @UpdateUser: 小霍
* @UpdateDate: 2019/9/7 13:45
* @Version: 0.0.1
*/

public class PasswordEncoder {private final static String[] hexDigits &#61; { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d","e", "f" };private final static String MD5 &#61; "MD5";private final static String SHA &#61; "SHA";private Object salt;private String algorithm;public PasswordEncoder(Object salt) {this(salt, MD5);}public PasswordEncoder(Object salt, String algorithm) {this.salt &#61; salt;this.algorithm &#61; algorithm;}/*** 密码加密* &#64;param rawPass* &#64;return*/public String encode(String rawPass) {String result &#61; null;try {MessageDigest md &#61; MessageDigest.getInstance(algorithm);// 加密后的字符串result &#61; byteArrayToHexString(md.digest(mergePasswordAndSalt(rawPass).getBytes("utf-8")));} catch (Exception ex) {}return result;}/*** 密码匹配验证* &#64;param encPass 密文* &#64;param rawPass 明文* &#64;return*/public boolean matches(String encPass, String rawPass) {String pass1 &#61; "" &#43; encPass;String pass2 &#61; encode(rawPass);return pass1.equals(pass2);}private String mergePasswordAndSalt(String password) {if (password &#61;&#61; null) {password &#61; "";}if ((salt &#61;&#61; null) || "".equals(salt)) {return password;} else {return password &#43; "{" &#43; salt.toString() &#43; "}";}}/*** 转换字节数组为16进制字串* * &#64;param b* 字节数组* &#64;return 16进制字串*/private String byteArrayToHexString(byte[] b) {StringBuffer resultSb &#61; new StringBuffer();for (int i &#61; 0; i < b.length; i&#43;&#43;) {resultSb.append(byteToHexString(b[i]));}return resultSb.toString();}/*** 将字节转换为16进制* &#64;param b* &#64;return*/private static String byteToHexString(byte b) {int n &#61; b;if (n < 0)n &#61; 256 &#43; n;int d1 &#61; n / 16;int d2 &#61; n % 16;return hexDigits[d1] &#43; hexDigits[d2];}public static void main(String[] args) {}
}

三、测试类

/*** 测试* &#64;param args*/public static void main(String[] args) {// 获取盐String salt &#61; PasswordUtils.getSalt();System.out.println("salt:"&#43; salt); // 8f5ca7b51f2a4e00b666// 对密码 666666 使用 盐 加密。salt &#61; "8f5ca7b51f2a4e00b666";String password &#61; PasswordUtils.encode("666666", salt);System.out.println(password); //57f896335fd98b87985780ef8b2ed4ee// 再判断boolean matches &#61; PasswordUtils.matches(salt, "666666", password);System.out.println(matches); // true}

在这里插入图片描述
也就是说获取salt 盐&#xff0c;拿着盐值加密密码 666666&#xff0c;盐值肯定是和密码保存起来的。
密码验证时&#xff0c;就是拿着用户输入的密码&#xff0c;与盐值加密&#xff0c;加密后的数据与 密文进行比较
如果成功&#xff0c;则密码正确。
不成功&#xff0c;则密码不正确。


推荐阅读
  • 开发笔记:对称加密详解,以及JAVA简单实现
     (原)常用的加密有3种1、正向加密,如MD5,加密后密文固定,目前还没办法破解,但是可以能过数据库撞库有一定概率找到,不过现 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • MybatisPlus入门系列(13) MybatisPlus之自定义ID生成器
    数据库ID生成策略在数据库表设计时,主键ID是必不可少的字段,如何优雅的设计数据库ID,适应当前业务场景,需要根据需求选取 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 如何搭建服务器环境php(2023年最新解答)
    导读:本篇文章编程笔记来给大家介绍有关如何搭建服务器环境php的相关内容,希望对大家有所帮助,一起来看看吧。本文目录一览:1、怎么搭建p ... [详细]
  • PHP连接MySQL的2种方法小结以及防止乱码【PHP】
    后端开发|php教程PHP,MySQL,乱码后端开发-php教程PHP的MySQL配置报错信息:ClassmysqlinotfoundinAnswer:1.在confphp.ini ... [详细]
  • MySQL中如何使用MD5加密
    这篇文章主要介绍“MySQL中如何使用MD5加密”,在日常操作中,相信很多人在MySQL中如何使用MD5加密问题上存在疑惑,小编查阅了各式资料,整理出简 ... [详细]
author-avatar
办事繁华_491
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有