热门标签 | 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编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文探讨了如何将Python对象转换为字节流,以实现文件保存、数据库存储或网络传输的需求。主要介绍了利用pickle模块进行序列化的具体方法。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • 本文探讨了在一个物理隔离的环境中构建数据交换平台所面临的挑战,包括但不限于数据加密、传输监控及确保文件交换的安全性和可靠性。同时,作者结合自身项目经验,分享了项目规划、实施过程中的关键决策及其背后的思考。 ... [详细]
  • 本文探讨了在使用JavaMail发送电子邮件时,抄送功能未能正常工作的问题,并提供了详细的代码示例和解决方法。 ... [详细]
  • 如何在U8系统中连接服务器并获取数据
    本文介绍了如何在U8系统中通过不同的方法连接服务器并获取数据,包括使用MySQL客户端连接实例的方法,如非SSL连接和SSL连接,并提供了详细的步骤和注意事项。 ... [详细]
  • 探讨密码安全的重要性
    近期,多家知名网站如CSDN、人人网、多玩、开心网等的数据库相继被泄露,其中大量用户的账户密码因明文存储而暴露无遗。本文将探讨黑客获取密码的常见手段,网站如何安全存储用户信息,以及用户应如何保护自己的密码。 ... [详细]
  • 在Java开发中,保护代码安全是一个重要的课题。由于Java字节码容易被反编译,因此使用代码混淆工具如ProGuard变得尤为重要。本文将详细介绍如何使用ProGuard进行代码混淆,以及其基本原理和常见问题。 ... [详细]
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社区 版权所有