messagedigest 图片加密_MessageDigest 加密和解密2

messagedigest 图片加密_MessageDigest 加密和解密2——————-解密—————————packagecom.drawthink.platform.util;importjava.io.UnsupportedEncodingException;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmE…

大家好,又见面了,我是你们的朋友全栈君。

——————-解密—————————

package com.drawthink.platform.util;

import java.io.UnsupportedEncodingException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.security.SecureRandom;

import java.util.Arrays;public classMyMD5Util {private static final String HEX_NUMS_STR=”0123456789ABCDEF”;private static final Integer SALT_LENGTH = 12;/**

* 将16进制字符串转换成字节数组

* @param hex

* @return*/

public static byte[] hexStringToByte(String hex) {int len = (hex.length() / 2);byte[] result = new byte[len];char[] hexChars =hex.toCharArray();for (int i = 0; i < len; i++) {int pos = i * 2;

result[i]= (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4

| HEX_NUMS_STR.indexOf(hexChars[pos + 1]));

}returnresult;

}/**

* 将指定byte数组转换成16进制字符串

* @param b

* @return*/

public static String byteToHexString(byte[] b) {

StringBuffer hexString= newStringBuffer();for (int i = 0; i < b.length; i++) {

String hex= Integer.toHexString(b[i] & 0xFF);if (hex.length() == 1) {

hex= ‘0’ +hex;

}

hexString.append(hex.toUpperCase());

}returnhexString.toString();

}/**

* 验证口令是否合法

* @param password

* @param passwordInDb

* @return

* @throws NoSuchAlgorithmException

* @throws UnsupportedEncodingException*/

public staticboolean validPassword(String password, String passwordInDb)throws NoSuchAlgorithmException, UnsupportedEncodingException {//将16进制字符串格式口令转换成字节数组

byte[] pwdInDb =hexStringToByte(passwordInDb);//声明盐变量

byte[] salt = new byte[SALT_LENGTH];//将盐从数据库中保存的口令字节数组中提取出来

System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);//创建消息摘要对象

MessageDigest md = MessageDigest.getInstance(“MD5”);//将盐数据传入消息摘要对象

md.update(salt);//将口令的数据传给消息摘要对象

md.update(password.getBytes(“UTF-8”));//生成输入口令的消息摘要

byte[] digest =md.digest();//声明一个保存数据库中口令消息摘要的变量

byte[] digestInDb = new byte[pwdInDb.length -SALT_LENGTH];//取得数据库中口令的消息摘要

System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, digestInDb.length);//比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同

if(Arrays.equals(digest, digestInDb)) {//口令正确返回口令匹配消息

return true;

}else{//口令不正确返回口令不匹配消息

return false;

}

}/**

* 获得加密后的16进制形式口令

* @param password

* @return

* @throws NoSuchAlgorithmException

* @throws UnsupportedEncodingException*/

public staticString getEncryptedPwd(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException {//声明加密后的口令数组变量

byte[] pwd = null;//随机数生成器

SecureRandom random = newSecureRandom();//声明盐数组变量

byte[] salt = new byte[SALT_LENGTH];//将随机数放入盐变量中

random.nextBytes(salt);//声明消息摘要对象

MessageDigest md = null;//创建消息摘要

md = MessageDigest.getInstance(“MD5”);//将盐数据传入消息摘要对象

md.update(salt);//将口令的数据传给消息摘要对象

md.update(password.getBytes(“UTF-8”));//获得消息摘要的字节数组

byte[] digest =md.digest();//因为要在口令的字节数组中存放盐,所以加上盐的字节长度

pwd = new byte[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);

}//测试方法

public static voidmain(String[] args) {try{

String password= “5a105e8b9d40e1329780d62ea2265d8a”;

boolean encryptedPwd=MyMD5Util.validPassword(password,password);

System.out.println(encryptedPwd);

}catch (NoSuchAlgorithmException |UnsupportedEncodingException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150209.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • setfacl解释「建议收藏」

    setfacl解释「建议收藏」setfacl:设置文件访问控制列表,针对单独文件,设置单独用户权限用法:setfacl-参数用户权限文件参数:-m,–modify=acl更改文件的访问控制列表-M,–modify-file=file从文件读取访问控制列表条目更改-x,–remove=acl根据文件中访问控制列表移除条目-X,–remove-file=file从文件读取访问控制列表条目…

  • Hadoop 简介

    Hadoop 简介Hadoop是什么Hadoop是一个提供分布式存储和计算的开源软件框架,它具有无共享、高可用(HA)、弹性可扩展的特点,非常适合处理海量数量。Hadoop是一个开源软件框架Hadoop适

  • AppSync for iOS7安装教程、Cydia软件源安装AppSync补丁

    AppSync for iOS7安装教程、Cydia软件源安装AppSync补丁么是ipa补丁ipa补丁在Cydia里的名称是ApPSync for iOS(版本号),是在越狱之后,通过同步itunes安装破解过的后缀名格式为.ipa软件,所用到的补丁。AppSyncforiOS7怎么安装?以下为安装步骤:将设备至于wifi环境下,打开越狱后新增的Cydia底部状态栏点击 管理,选择软件源点击右上角 编辑 然后点击左上角的 添加

  • IDEA怎么生成UML类图

    IDEA怎么生成UML类图最近在开发的过程当中,对于已有的代码,想将相关类绘制成UML类图,虽然现在有很多UML类图的优秀软件,比如ProcessOn(可视化编辑)、draw.io(可视化编辑)、PlantUML(代码生成),其实看到这里我就想IDEA中有没有像PlantUML一样的自动生成的插件,本着怀疑的态度百度了一下,果然IDEA还是很强大的,这个插件都是自带的,接下稍微讲述如何利用IDEA生成UML类图的教程。…

  • zigbee协议栈串口收发 From zigbee菜鸟笔记(十 二)

    zigbee协议栈串口收发 From zigbee菜鸟笔记(十 二)一.串口问题关于串口的一些常识欢迎点击进入串口中断二.协议栈串口发送问题

  • asp.net dropdownlist的值怎么设置_ASPNET程序开发招聘

    asp.net dropdownlist的值怎么设置_ASPNET程序开发招聘我刚刚开始学习ASP.NET,所以当然有点辛苦,懂的不是很多…今天写程序时碰到了控件DrowDownList.–列表控件….当我改变控件的值时,怎么也不能改变另一个DropDownList控件的值,查了MSDN之后才知道--原来我的AutoPostBack属性没有设置成”true”所以不能刷新,但是当我改完之后确实能够刷新了,但是每次刷新之后并不能改变需要触发事件的那个

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号