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();

}

}

}

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • phpstorm 比较修改过的代码 version control

    phpstorm 比较修改过的代码 version control

    2021年11月10日
    57
  • 51单片机之逻辑运算指令ANL、ORL、XRL等

    51单片机之逻辑运算指令ANL、ORL、XRL等文章目录前言一、简单操作指令CLR、CPL、SWAPCLRACPLASWAPA二、位移指令RL、RR、RLC、RRCRLARRARLCARRCA三、逻辑“与”指令ANLANLA,XXXANLdirect,XXX四、逻辑“或”指令ORLORLA,XXXORLdirect,XXX五、逻辑“异或”指令XRLORLA,XXXXRLdirect,XXX前言…

    2022年7月26日
    18
  • 遍历map的key和value_有序的map集合

    遍历map的key和value_有序的map集合Golang map实现原理是hash map(核心元素是桶,key通过哈希算法被归入不同的bucket中),key是无序的,很多应用场景可能需要map key有序(例如交易所订单撮合),C++ 的stl map 实现了key有序,实际上是TreeMap是基于树(红黑树)的实现方式,即添加到一个有序列表,在O(log n)的复杂度内通过key值找到value,优点是空间要求低,但在时…

    2022年9月23日
    0
  • win10中修改mac地址(总有一款适合你)

    win10中修改mac地址(总有一款适合你)我的解决办法如下:先上图:下面转自:Win10秘笈:两种方式修改网卡物理地址(MAC)https://www.ithome.com/html/win10/244510.htm在修改之前,可以先确定一下要修改的网卡MAC地址,查询方法有很多种,比如:1、在设置→网络和Internet→WLAN/以太网,如下图——2、在控制

    2022年5月12日
    75
  • Vim设置换行缩进[通俗易懂]

    Vim设置换行缩进[通俗易懂]vi~/.vimrcsetts=4setexpandtabsetautoindent

    2022年9月30日
    0
  • c++ STL_鱼c

    c++ STL_鱼c学校并未教授C++,当初接触的C++的STL,也是皮毛而已。结合对Java的集合框架等内容的认识,回顾这部分内容,收获很大。文章目录概述STL六大组件简介三大组件介绍1.容器2.算法3.迭代器常用容器1.string容器string容器基本概念string容器常用操作2.vector容器vector容器基本概念vector迭代器vector的数据结构vector常用API操作…

    2022年10月16日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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