热门标签 | 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;则密码不正确。


推荐阅读
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
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社区 版权所有