问题描述:
想求一个jsp的md5加密代码
网上有很多jsp类加密出来有16位的,但是与asp程序生成的不一样,jsp密码注册进去数据库后通过asp动网论坛无法登陆成功,也就是说 jsp生成的与asp动网本身的md5生成的不一样,有没有朋友能帮我一下。
我想再说两句,我的问题是我用网上下载的 jsp的md5生成的16位值写入asp动网论坛的库后结果通过论坛页面无法登陆,也就是说,我要找的是一个能和 asp动网论坛生成md5 16位结果一样的代码.
要不也可以分享一下别的方法可以解决我这个问题的,就是通过java注册原有的asp网站sql 数据库但是密码要通过md5加密。通过论坛可以直接登陆。
问题解答:
MD5算法是固定的,不是说某人的MD5和另外的md5不一样
你提取动网论坛加密后的MD5码,比如你加密“AAA” ,然后去找标准的MD5加密AAA,如果获得的密文不一样,那说明动网论坛系统对md5进行了修改或2次加密,如果你没有动网源码那就完全没戏了
-------------------------------------------
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* 随便写的一个MD5加密 参数code为原文,默认返回值为MD5的32位密文
*16位那行去掉最左端注释符 返回值就是16位
* */
public String enCodeByMD5(String code) {
String password = code;
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(code.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
password = buf.toString();//32位的加密
// password = password.substring(8,24);//16位的加密
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return password;
}
----------------------------------------
以上为MD5加密
----------------------------------------
下面那个是我自己写的一个纯数学方法加密,很简单,模仿MD5的信息摘要法,该算法也是不可逆加密; 尽管算法强度,效率,都比不上MD5..但是是新算法,所以不可能会有穷举数据库,源码也是我第一次在百度知道上发,目前的安全性反而比MD5高一些。
---
public String enCodeByMath(String code) {
int k;
int l;
StringBuffer sbuf = new StringBuffer();
int cl = code.length();
long tempInt1 = 0L;
byte[] tempByte1 = code.getBytes();
byte[] arrayOfByte1 = tempByte1;
int i = 0;
for (int j = arrayOfByte1.length; i < j; ++i) {
byte b = arrayOfByte1[i];
tempInt1 = ((tempInt1 + b + 1L) * (b - cl) - cl * cl) * (b + 100 - cl * cl);
sbuf.append(String.valueOf(Math.abs(tempInt1)));
}
for (i = cl; sbuf.length() < 200; ++i)
if (i + 1 < sbuf.length()) {
sbuf.append(sbuf.toString().substring(i, i + 1));
} else
sbuf.append("a");
byte[] tempByte2 = sbuf.toString().getBytes();
int[][] tempInt2 = new int[10][20];
k = 0;
for (l = 0; l < 10; ++l)
for (int j = 0; j < 20; ++j) {
tempInt2[l][j] = (tempByte2[k] * cl);
++k;
}
sbuf.delete(0, sbuf.length());
for (l = 0; l < 10; ++l)
sbuf.append(Math.abs(tempInt2[l][l] * cl - tempInt2[l][(l + 10)] * (16 - cl)));
String puzzleCode = sbuf.toString();
tempByte2 = null;
tempInt2 = null;
return puzzleCode;
}
irf540 09.02.04