MD5登陆密码的生成
package com.cinc.ecmp.userpermission.utils;
import java.security.MessageDigest;
import java.security.SecureRandom;
/**
* @Author: hhr
* @Despriction: md5加解密密码
* @CreatedTime: 2019/6/13 10:02
* @ModifyBy:
* @ModifyTime:
* @ModifyDespriction:
* @Version: V1.0.0
*/
public class MD5Utils {
/**
* 盐值长度
*/
private static final int SALT_LENGTH = 30;
/**
* 加密算法
*/
private static final String ALGORITHM = "MD5";
/**
* 编码
*/
private static final String CHARSET = "UTF-8";
/**
* 密码加密长度
*/
private static final int MD5_LENGTH = 32;
/**
* byte数组转换成十六进制字符串
*
* @param bytes byte数组
* @return
*/
private static String bytesToHexStr(byte[] bytes) {
String tmp = "";
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < bytes.length; i++) {
tmp = Integer.toHexString(bytes[i] & 0xFF);
sb.append((tmp.length() == 1) ? "0" + tmp : tmp);
}
return sb.toString().toUpperCase().trim();
}
/**
* 十六进制字符串转成byte数组
* @param hexStr 十六进制字符串
* @return
*/
private static byte[] hexStrToBytes(String hexStr) {
byte[] bytes = new byte[hexStr.length() / 2];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) Integer.parseInt(hexStr.substring(2 * i, 2 * i + 2), 16);
}
return bytes;
}
/**
* 生成随机盐
* @return 返回长度为SALT_LENGTH * 2的盐
*/
public static String createSaltValue() {
SecureRandom random = new SecureRandom();
byte[] salt = new byte[SALT_LENGTH];
random.nextBytes(salt);
return bytesToHexStr(salt);
}
/**
* 用户密码使用md5加密
* @param password 用户密码
*@return 返回长度为32位的16进制字符串
*/
public static String md5EncodePwd(String password) {
try {
MessageDigest digest = MessageDigest.getInstance(ALGORITHM);
byte[] result = digest.digest(password.getBytes(CHARSET));
return bytesToHexStr(result);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 按照salt+pwd的顺序返回最终要保存到数据库的密码
* @param salt 随机盐
* @param md5encodePwd 经过md5加密的字符串
*@return 按照规则返回的最终密码
*/
public static String getFinalPwd(String salt, String md5encodePwd) {
StringBuilder stringBuilder = new StringBuilder();
/**
* 前64位规则:
* 奇数位是用户真实密码的hash值
* 偶数为是盐值
* 后16位:是剩余的盐值
*/
for (int i = 0; i < md5encodePwd.length(); i++) {
stringBuilder.append(md5encodePwd.substring(i, i + 1)).append(salt.substring(i, i + 1));
}
stringBuilder.append(salt.substring(md5encodePwd.length(), salt.length()));
return stringBuilder.toString();
}
/**
* 按照salt+pwd的顺序返回最终要保存到数据库的密码
* @return 按照规则返回的最终密码
*/
public static String createHashPwd(String password) {
return getFinalPwd(createSaltValue(), md5EncodePwd(password));
}
/**
* 从数据库中保存的最终密码,解析出用户真实秘密的md5加密串
* @return 返回真实秘密的加密串
*/
public static String getUserPwdMD5(String finalPwd) {
try {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < MD5_LENGTH * 2; i += 2) {
stringBuilder.append(finalPwd.substring(i, i + 1));
}
return stringBuilder.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 验证用户输入的密码是否正确
* @param password 用户输入的密码
* @param finalPwd 数据库中保存的密码
* @return
* 验证结果:true密码正确,反之密码错误
*/
public static boolean verifyPwd(String password, String finalPwd) {
return password == null ? false : md5EncodePwd(password).equals(getUserPwdMD5(finalPwd));
}
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < 100; i++) {
/* 生成加密密码 */
String userPwd = "yan123shao@wy" + i;
String salt = createSaltValue();
System.out.println("盐值>>" + salt);
String md5encodePwd = md5EncodePwd(userPwd);
System.out.println("md5>>" + md5encodePwd);
String finalPwd = getFinalPwd(salt, md5encodePwd);
if (sb.toString().contains(finalPwd)) {
System.out.println("重复的密码>>" + finalPwd);
break;
}
sb.append(finalPwd);
System.out.println("最终密码>>" + finalPwd);
/**用户登录输入密码,验证秘密是否正确*/
boolean verify = verifyPwd(userPwd, finalPwd);
System.out.println("密码正确");
if (verify == false) {
System.out.println("输入的密码>>" + userPwd + ">>密码验证失败>>" + getUserPwdMD5(finalPwd));
break;
}
}
}
}
MD5登陆密码的生成的更多相关文章
- 忘记hmailiserver邮件服务器后台登陆密码解决
进入后台进行hmailiserver的相关设置,发现登陆密码忘记了,如下图:
- Android MD5校验码的生成与算法实现
在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD5 的128 位整数.然后将此 128 位计 ...
- 类似discuz密码的生成规则
/* 生成一个串,uniqid(rand()): uniqid(prefix,more_entropy) 函数基于以微秒计的当前时间,生成一个唯一的 ID. 如果 prefix 参数为空,则返回的字符 ...
- 忘记Windows7登陆密码解决办法
忘记 Windows7 的登陆密码,解决这个问题的思路就是替换 system32 下的 Magnify.exe . 可以从 WindowsPE 启动,到 C:\windows\system32 下. ...
- Win7开机登陆密码忘记了?不必重做系统(详图)
1)如果是普通账户密码忘了.方法:重新启动电脑,启动到系统登录界面时,同时按住Ctrl+Alt键,然后连击Del键两次,会出现新的登录界面,用户名处输入“Administrator”密码为空,回车即 ...
- linux普通用户权限设置为超级用户权限方法、sudo不用登陆密码
以用户zato为例 普通用户权限设置为超级用户权限 进入有超级用户权限的账号 添加文件可写(w)权限 sudo chmod u+x /etc/sudoers 编辑/etc/sudoers文件 添加语句 ...
- WebCracker4.0和monster字典——路由器登陆密码破解工具
路由器登陆密码破解,很伤cpu的
- Win10 登陆密码不正确(安全模式仍然启动不了)
今天朋友重启Win10后,登陆密码显示不正确,是用了很多方法都不行 然后就瞎捣鼓就进去 进入BIOS将启动模式调为USB模式 重启启动不了后 再改回系统启动 就进去了(好神奇)
- thinkcmf 忘记后台登陆密码的解决办法
thinkcmf 忘记密码 或者 密码错误 如何修改后台登陆密码? 直接在后台登陆控制器里输入 dump(cmf_password('123456')); 参考文件路径 app\admin\contr ...
随机推荐
- text()和html()区别
这两天看了一下html和jquery的选择器,并对w3chool上面的在线编辑产生了兴趣,但是在用textarea展示后台纯html的时候发生错误,查阅各种资料发现不行--心态炸了.废话不多说了,上干 ...
- 开启远程XUL
参考:https://developer.mozilla.org/zh-cn/Remote_XUL firefox自4.0起(2011年4月版本,目前最新版为13.0),开始禁用远程XUL,这阻碍了初 ...
- Laravel 单设备登录
https://laravel-china.org/articles/10605/laravel-single-device-login 前几天在 laracasts 看了laravel5.6的新功能 ...
- IDEA切换git分支
查看当前所在分支 场景:在多人开发中,需要在主分支的基础上创建一些分支分配给小团队或个人去开发,然后小分支上的小功能开发完毕之后,再merge(合并)到主分支. 1.查看当前所在的分支 下图1.1中是 ...
- 巨蟒python全栈开发-第11阶段 ansible3_4
1.ansible roles 2.nginx+uwsgi扩展 3.celery异步任务 4.celery延时任务 5.周期任务 6.celery与django结合 7.网络基础 8.celery监 ...
- 2018-8-10-win10-uwp-使用动画修改-Grid-column-的宽度
title author date CreateTime categories win10 uwp 使用动画修改 Grid column 的宽度 lindexi 2018-08-10 19:17:19 ...
- 一、JVM内存区域组成
一.JVM内存区域组成 java把内存分四种: 1.栈区(stack segment)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放内存资源 2. ...
- iptables 通讯端口转接(Port Forwarding)
是一种特殊的DNAT操作,其作用是让一部电脑(通常是防火牆)担任其它电脑的代理伺服器(proxy).防火牆接收外界网络接传给它自己的包,然后改写包的目的地位址或目的端口,使其像是要送到內部网路其它电脑 ...
- html--图片img
一.图片的基本格式 当前万维网上流行的图像格式以GIF及JPEG为主,另外还有一个PNG.以下做分别介绍: 1.GIF格式:采用LZW压缩,是以压缩相同颜色的色块来减少图像大小的.(LZW压缩是一种能 ...
- js实现圆形的碰撞检测
文章地址:https://www.cnblogs.com/sandraryan/ 碰撞检测这个东西写小游戏挺有用der~~~ 注释写的还挺全,所以就不多说了,看注释 这是页面结构.wrap存放生成的小 ...