MD5加盐加密

package com.chauvet.utils;

import java.security.NoSuchAlgorithmException;
import java.util.Random;

/***
* MD5
* @author WXW
*
*/
public class MD5Util {
private final String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.";
private final String ikey = "-x6g6ZWm2G9g_vr0Bo.pOq3kRIxwangxiaowei";
private static String key = "myNameIsChauvet20160824";// 盐

/**
* 加密部分 加盐
* @param txt
* @param key
* @return
*/
public String encrypt(String txt,String key){
Random random = new Random();
int nh1 = Math.abs(random.nextInt(64));
int nh2 = Math.abs(random.nextInt(64));
int nh3 = Math.abs(random.nextInt(64));
char ch1 = chars.toCharArray()[nh1];
char ch2 = chars.toCharArray()[nh2];
char ch3 = chars.toCharArray()[nh3];
int nhnum = nh1 + nh2 + nh3;
int knum = 0;
for(int i=0;i<key.length();i++)
knum +=(int)key.toCharArray()[i];
String mdKey = null;
try {
mdKey = MD5.MD5Encode(MD5.MD5Encode(MD5.MD5Encode(key+ch1)+ch2+ikey)+ch3).substring((int)(nhnum%8),(int)(nhnum%8)+(int)(knum%8 + 16));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
txt = BaseUtil.Base64Encode(txt);
txt = txt.replace(‘+‘,‘-‘);txt = txt.replace(‘/‘,‘_‘);txt = txt.replace(‘=‘,‘.‘);
String tmp = "";
int j=0;int k = 0;
int tlen = txt.length();
int klen = mdKey.length();
for (int i=0; i<tlen; i++) {
k = k == klen ? 0 : k;
j = (nhnum+chars.indexOf(txt.toCharArray()[i])+((int)(mdKey.toCharArray()[k++])))%64;
tmp += chars.toCharArray()[j];
}
int tmplen = tmp.length();
StringBuffer br = new StringBuffer();
br.append(tmp);
br.insert(nh2 % ++tmplen, ch3);
tmp = br.toString();
StringBuffer br2 = new StringBuffer();
br2.append(tmp);
br2.insert(nh1 % ++tmplen, ch2);
tmp = br2.toString();
StringBuffer br3 = new StringBuffer();
br3.append(tmp);
br3.insert(knum % ++tmplen, ch1);
tmp = br3.toString();

return tmp;
}
/**
* 解密部分
* @param txt
* @param key
* @return
*/
public String decrypt(String txt,String key){
int knum = 0;
int tlen = txt.length();

for(int i=0;i<key.length();i++)
knum +=(int)key.toCharArray()[i];

char ch1 = txt.toCharArray()[knum % tlen];
int nh1 = chars.indexOf(ch1);

StringBuffer br = new StringBuffer();
br.append(txt);
int ttt1 = knum % tlen--;
txt = br.replace(ttt1, ttt1+1, "").toString();

char ch2 = txt.toCharArray()[nh1 % tlen];
int nh2 = chars.indexOf(ch2);
StringBuffer br2 = new StringBuffer();
br2.append(txt);
int ttt2 = nh1 % tlen--;
txt = br2.replace(ttt2, ttt2+1, "").toString();

char ch3 = txt.toCharArray()[nh2 % tlen];
int nh3 = chars.indexOf(ch3);
StringBuffer br3 = new StringBuffer();
br3.append(txt);
int ttt3 = nh2 % tlen--;
txt = br3.replace(ttt3, ttt3+1, "").toString();

int nhnum = nh1 + nh2 + nh3;

String mdKey = null;
try {
mdKey = MD5.MD5Encode(MD5.MD5Encode(MD5.MD5Encode(key+ch1)+ch2+ikey)+ch3).substring((int)(nhnum % 8),(int)(nhnum % 8)+(int)(knum % 8 + 16));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}

String tmp = "";
int j=0; int k = 0;
tlen = txt.length();
int klen = mdKey.length();
for (int i=0; i<tlen; i++) {
k = k == klen ? 0 : k;
j = chars.indexOf(txt.toCharArray()[i])-nhnum - ((int)(mdKey.toCharArray()[k++]));
while (j<0)
j+=64;
tmp += chars.toCharArray()[j];
}
tmp = tmp.replace(‘-‘,‘+‘);tmp = tmp.replace(‘_‘,‘/‘);tmp = tmp.replace(‘.‘,‘=‘);
tmp = BaseUtil.Base64Decode(tmp);
tmp = tmp.replace((char)0, ‘ ‘).replace(" ", "");
return tmp;
}

public static void main(String[] args) {
String a = new MD5Util().encrypt("[email protected]", key);
System.out.println(a);
String b = new MD5Util().decrypt("HvLV0ICDQNP_fUON5pDdqcp3d48", key);
System.out.println(b);
}

}

时间: 2025-01-08 19:44:20

MD5加盐加密的相关文章

一种简单的md5加盐加密的方法(防止彩虹表撞库)

md5加密(或者说摘要算法)大家都很熟悉了 就不解释了 现在很多数据库设计都喜欢用单向加密的方式保存密码,验证时对提交的密码再次加密之后做密文对比 /// <summary> 使用MD5加密 /// </summary> /// <param name="input">加密字符串</param> /// <remarks>2015.08.26</remarks> public static Guid ToMD5(s

密码的加盐加密

我们 所 使用密码的加密方式 大多为md5 加密  但是一些不法分子 利用 云计算 分布式计算 可以暴力破解我们的密码 我们通过 加入盐值的方式 加密 密码使得密码 不会被轻易破解 1 //对密码进行加盐加密 2 $password = $this->data['password']; 3 //生成盐值 随机生成几个字符串 4 $altToken = md5(String::randString(10)); 5 //加入盐值 6 $password = md5($password.$altTok

加盐加密salt

加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“(salt)的n位随机数相关联. 加盐加密是一种对系统登录口令的加密方式,它实现的方式是将每一个口令同一个叫做”盐“(salt)的n位随机数相关联.无论何时只要口令改变,随机数就改变.随机数以未加密的方式存放在口令文件中,这样每个人都可以读.不再只保存加密过的口令,而是先将口令和随机数连接起来然后一同加密,加密后的结果放在口令文件中. 为什么需要加盐加密? 普通的加密方式不够安全吧,加点盐掺杂在需要加密的字符串中,

关于MD5+salt盐加密

MD5+salt 最近浏览浏览一些帖子时,发现曾经引以为傲的md5加密算法,虽然是无法解密的算法,但是现在可以通过FELHELP(谷歌浏览器插件)或者一些字典可以套出来,.但是当md5+salt值时,套出的几率微乎其微. ---以下参考:微尔雅-的java关于md5+salt盐加密验证 一.陈述一下工作流程: 1.根据已有的密码字符串去生成一个密码+盐字符串,可以将盐的加密字符串也存放在数据库(看需求), 2.验证时将提交的密码字符串进行同样的加密再从数据库中取得已有的盐进行组合密码+盐的字符串

MD5 加密 以及 加盐加密

这是MD5加密 - (NSString *)MD5Hash { const char *cStr = [self UTF8String]; unsigned char result[16]; CC_MD5(cStr, strlen(cStr), result); NSString * string= [NSString stringWithFormat: @"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X"

md5 加盐

private void button1_Click(object sender, EventArgs e) { string s = GetMd5(textBox1.Text.Trim()); MessageBox.Show(s); } private static string GetMd5(string sDataIn) { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); byte[] bytValue, byt

Java关于md5+salt盐加密验证

一.陈述一下工作流程: 1.根据已有的密码字符串去生成一个密码+盐字符串,可以将盐的加密字符串也存放在数据库(看需求), 2.验证时将提交的密码字符串进行同样的加密再从数据库中取得已有的盐进行组合密码+盐的字符串和已有的进行验证 package com.mi.util; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgori

MD5加密加盐

Java实现MD5的随机加盐加密,这样以来就很难解密了,必须使用原密码才能正常的登录系统了,以下为Java实现的MD5随机加盐加密,以及使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转: 1 package com.dq.online.onlinezuul.util; 2 3 import org.apache.commons.codec.binary.Hex; 4 5 import java.security.MessageDigest; 6 import java.u

Shiro___加密加盐迭代

简单的模拟账号密码登入,为了简便就不去数据库真实的查询了 这里先使用MD5加盐迭代加密,算出我们的密码加密结果 MD5是不可逆的,单向加密,所以我们需要对原始数据进行加密后与加密的数据对比,而不是去解密 package com.test; import org.apache.shiro.crypto.hash.Md5Hash; /** * 对123456加密, * 盐值(salt):zsl * 迭代次数:6 * 加密结果:70fc2a964652cf72d7f67022a7951e51 * @a