MD5加密解密类JavaWord下载.docx
- 文档编号:17888283
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:14
- 大小:16.97KB
MD5加密解密类JavaWord下载.docx
《MD5加密解密类JavaWord下载.docx》由会员分享,可在线阅读,更多相关《MD5加密解密类JavaWord下载.docx(14页珍藏版)》请在冰豆网上搜索。
for(inti=0;
i<
len;
i++){
intpos=i*2;
result[i]=(byte)(HEX_NUMS_STR.indexOf(hexChars[pos])<
<
4
|HEX_NUMS_STR.indexOf(hexChars[pos+1]));
}
returnresult;
*将指定byte数组转换成16进制字符串
*@paramb
publicstaticStringbyteToHexString(byte[]b){
StringBufferhexString=newStringBuffer();
b.length;
Stringhex=Integer.toHexString(b[i]&
0xFF);
if(hex.length()==1){
hex='
0'
+hex;
hexString.append(hex.toUpperCase());
returnhexString.toString();
*验证口令是否合法
*@parampassword
*@parampasswordInDb
*@throwsNoSuchAlgorithmException
*@throwsUnsupportedEncodingException
publicstaticbooleanvalidPassword(Stringpassword,StringpasswordInDb)
throwsNoSuchAlgorithmException,UnsupportedEncodingException{
//将16进制字符串格式口令转换成字节数组
byte[]pwdInDb=hexStringToByte(passwordInDb);
//声明盐变量
byte[]salt=newbyte[SALT_LENGTH];
//将盐从数据库中保存的口令字节数组中提取出来
System.arraycopy(pwdInDb,0,salt,0,SALT_LENGTH);
//创建消息摘要对象
MessageDigestmd=MessageDigest.getInstance("
MD5"
);
//将盐数据传入消息摘要对象
md.update(salt);
//将口令的数据传给消息摘要对象
md.update(password.getBytes("
UTF-8"
));
//生成输入口令的消息摘要
byte[]digest=md.digest();
//声明一个保存数据库中口令消息摘要的变量
byte[]digestInDb=newbyte[pwdInDb.length-SALT_LENGTH];
//取得数据库中口令的消息摘要
System.arraycopy(pwdInDb,SALT_LENGTH,digestInDb,0,digestInDb.length);
//比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同
if(Arrays.equals(digest,digestInDb)){
//口令正确返回口令匹配消息
returntrue;
}else{
//口令不正确返回口令不匹配消息
returnfalse;
*获得加密后的16进制形式口令
publicstaticStringgetEncryptedPwd(Stringpassword)
//声明加密后的口令数组变量
byte[]pwd=null;
//随机数生成器
SecureRandomrandom=newSecureRandom();
//声明盐数组变量
//将随机数放入盐变量中
random.nextBytes(salt);
//声明消息摘要对象
MessageDigestmd=null;
//创建消息摘要
md=MessageDigest.getInstance("
//获得消息摘要的字节数组
//因为要在口令的字节数组中存放盐,所以加上盐的字节长度
pwd=newbyte[digest.length+SALT_LENGTH];
//将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐
System.arraycopy(salt,0,pwd,0,SALT_LENGTH);
//将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节
System.arraycopy(digest,0,pwd,SALT_LENGTH,digest.length);
//将字节数组格式加密后的口令转化为16进制字符串格式的口令
returnbyteToHexString(pwd);
}
publicclassMyMD5Util{
privatestaticfinalStringHEX_NUMS_STR="
privatestaticfinalIntegerSALT_LENGTH=12;
/**
*将16进制字符串转换成字节数组
*@paramhex
*@return
*/
publicstaticbyte[]hexStringToByte(Stringhex){
intlen=(hex.length()/2);
byte[]result=newbyte[len];
char[]hexChars=hex.toCharArray();
for(inti=0;
i++){
intpos=i*2;
result[i]=(byte)(HEX_NUMS_STR.indexOf(hexChars[pos])<
4
|HEX_NUMS_STR.indexOf(hexChars[pos+1]));
}
returnresult;
/**
*将指定byte数组转换成16进制字符串
*@paramb
*@return
publicstaticStringbyteToHexString(byte[]b){
StringBufferhexString=newStringBuffer();
Stringhex=Integer.toHexString(b[i]&
if(hex.length()==1){
hex='
hexString.append(hex.toUpperCase());
returnhexString.toString();
*验证口令是否合法
*@parampassword
*@parampasswordInDb
*@throwsNoSuchAlgorithmException
*@throwsUnsupportedEncodingException
publicstaticbooleanvalidPassword(Stringpassword,StringpasswordInDb)
throwsNoSuchAlgorithmException,UnsupportedEncodingException{
//将16进制字符串格式口令转换成字节数组
byte[]pwdInDb=hexStringToByte(passwordInDb);
//声明盐变量
byte[]salt=newbyte[SALT_LENGTH];
//将盐从数据库中保存的口令字节数组中提取出来
System.arraycopy(pwdInDb,0,salt,0,SALT_LENGTH);
//创建消息摘要对象
MessageDigestmd=MessageDigest.getInstance("
//将盐数据传入消息摘要对象
md.update(salt);
//将口令的数据传给消息摘要对象
md.update(password.getBytes("
//生成输入口令的消息摘要
byte[]digest=md.digest();
//声明一个保存数据库中口令消息摘要的变量
byte[]digestInDb=newbyte[pwdInDb.length-SALT_LENGTH];
//取得数据库中口令的消息摘要
System.arraycopy(pwdInDb,SALT_LENGTH,digestInDb,0,digestInDb.length);
//比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同
if(Arrays.equals(digest,digestInDb)){
//口令正确返回口令匹配消息
returntrue;
}else{
//口令不正确返回口令不匹配消息
returnfalse;
*获得加密后的16进制形式口令
publicstaticStringgetEncryptedPwd(Stringpassword)
//声明加密后的口令数组变量
byte[]pwd=null;
//随机数生成器
SecureRandomrandom=newSecureRandom();
//声明盐数组变量
//将随机数放入盐变量中
random.nextBytes(salt);
//声明消息摘要对象
MessageDigestmd=null;
//创建消息摘要
md=MessageDigest.getInstance("
//获得消息摘要的字节数组
//因为要在口令的字节数组中存放盐,所以加上盐的字节长度
pwd=newbyte[digest.length+SALT_LENGTH];
//将盐的字节拷贝到生成的加密口令字节数组的前12个字节,以便在验证口令时取出盐
System.arraycopy(salt,0,pwd,0,SALT_LENGTH);
//将消息摘要拷贝到加密口令字节数组从第13个字节开始的字节
System.arraycopy(digest,0,pwd,SALT_LENGTH,digest.length);
//将字节数组格式加密后的口令转化为16进制字符串格式的口令
returnbyteToHexString(pwd);
}
测试类——Client,代码如下:
viewplaincopytoclipboardprint?
importjava.util.HashMap;
importjava.util.Map;
publicclassClient{
privatestaticMapusers=newHashMap();
publicstaticvoidmain(String[]args){
StringuserName="
zyg"
Stringpassword="
123"
registerUser(userName,password);
userName="
changong"
password="
456"
StringloginUserId="
Stringpwd="
1232"
try{
if(loginValid(loginUserId,pwd)){
System.out.println("
欢迎登陆!
!
"
}else{
口令错误,请重新输入!
}catch(NoSuchAlgorithmExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(UnsupportedEncodingExceptione){
*注册用户
*
*@paramuserName
publicstaticvoidregisterUser(StringuserName,Stringpassword){
StringencryptedPwd=null;
encryptedPwd=MyMD5Util.getEncryptedPwd(password);
users.put(userName,encryptedPwd);
*验证登陆
publicstaticbooleanloginValid(StringuserName,Stringpassword)
throwsNoSuchAlgorithmException,UnsupportedEncodingException{
S
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MD5 加密 解密 Java