java messagedigest_Java自带的加密类MessageDigest类代码示例
MessageDigest 类
MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
MessageDigest 对象开始被初始化。该对象通过使用 update()方法处理数据。任何时候都可以调用 reset()方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用digest() 方法之一完成哈希计算。
对于给定数量的更新数据,digest 方法只能被调用一次。在调用 digest 之后,MessageDigest 对象被重新设置成其初始状态。
说明:
在网站中,为了保护网站会员的用户名和密码等隐私信息,所以我们在用户注册时就直接进行MD5方式或其他方式进行加密,即使是数据库管理员也不能查看该会员的密码等信息,在数据库中查看密码效果如:8e830882f03b2cb84d1a657f346dd41a效果。
因为MD5算法是不可逆的,所以被很多网站广泛使用。
普遍使用的三种加密方式
方式一:使用位运算符,将加密后的数据转换成16进制
方式二:使用格式化方式,将加密后的数据转换成16进制(推荐)
方式三:使用算法,将加密后的数据转换成16进制
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* 使用Java自带的MessageDigest类
* @author xiaokui
*/
public class EncryptionUtil {
/**
* 由于MD5 与SHA-1均是从MD4 发展而来,它们的结构和强度等特性有很多相似之处
* SHA-1与MD5 的最大区别在于其摘要比MD5 摘要长 32 比特(1byte=8bit,相当于长4byte,转换16进制后比MD5多8个字符)。
* 对于强行攻击,:MD5 是2128 数量级的操作,SHA-1 是2160数量级的操作。
* 对于相同摘要的两个报文的难度:MD5是 264 是数量级的操作,SHA-1 是280 数量级的操作。
* 因而,SHA-1 对强行攻击的强度更大。 但由于SHA-1 的循环步骤比MD5 多(80:64)且要处理的缓存大(160 比特:128 比特),SHA-1 的运行速度比MD5 慢。
*
* @param source 需要加密的字符串
* @param hashType 加密类型 (MD5 和 SHA)
* @return
*/
public static String getHash(String source, String hashType) {
// 用来将字节转换成 16 进制表示的字符
char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
MessageDigest md = MessageDigest.getInstance(hashType);
md.update(source.getBytes());
// 通过使用 update 方法处理数据,使指定的 byte数组更新摘要
byte[] encryptStr = md.digest();
// 获得密文完成哈希计算,产生128 位的长整数
char str[] = new char[16 * 2];
// 每个字节用 16 进制表示的话,使用两个字符
int k = 0;
// 表示转换结果中对应的字符位置
for (int i = 0; i < 16; i++) {
// 从第一个字节开始,对每一个字节,转换成 16 进制字符的转换
byte byte0 = encryptStr[i];
// 取第 i 个字节
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
// 取字节中高 4 位的数字转换, >>> 为逻辑右移,将符号位一起右移
str[k++] = hexDigits[byte0 & 0xf];
// 取字节中低 4 位的数字转换
}
return new String(str);
// 换后的结果转换为字符串
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
/** @param source 需要加密的字符串
* @param hashType 加密类型 (MD5 和 SHA)
* @return
*/
public static String getHash2(String source, String hashType) {
StringBuilder sb = new StringBuilder();
MessageDigest md5;
try {
md5 = MessageDigest.getInstance(hashType);
md5.update(source.getBytes());
for (byte b : md5.digest()) {
sb.append(String.format("%02X", b));
// 10进制转16进制,X 表示以十六进制形式输出,02 表示不足两位前面补0输出
}
return sb.toString();
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
/** @param source 需要加密的字符串
* @param hashType 加密类型 (MD5 和 SHA)
* @return
*/
public static String getHash3(String source, String hashType) {
// 用来将字节转换成 16 进制表示的字符
char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
StringBuilder sb = new StringBuilder();
MessageDigest md5;
try {
md5 = MessageDigest.getInstance(hashType);
md5.update(source.getBytes());
byte[] encryptStr = md5.digest();
for (int i = 0; i < encryptStr.length; i++) {
int iRet = encryptStr[i];
if (iRet < 0) {
iRet += 256;
}
int iD1 = iRet / 16;
int iD2 = iRet % 16;
sb.append(hexDigits[iD1] + "" + hexDigits[iD2]);
}
return sb.toString();
}
catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
System.out.println(getHash("小奎", "MD5"));
System.out.println(getHash("小奎", "SHA") + "\n");
System.out.println(getHash2("小奎", "MD5"));
System.out.println(getHash2("小奎", "SHA") + "\n");
System.out.println(getHash3("小奎", "MD5"));
System.out.println(getHash3("小奎", "SHA") + "\n");
}
}
输出结果
8e830882f03b2cb84d1a657f346dd41a
0ba5512371d00c86e91712f44aab7138
8E830882F03B2CB84D1A657F346DD41A
0BA5512371D00C86E91712F44AAB713898745F91
8e830882f03b2cb84d1a657f346dd41a
0ba5512371d00c86e91712f44aab713898745f91
我们发现,3个方法执行效果相同,SHA长度要比MD5多出8个字符(32比特)
总结
以上就是本文关于Java自带的加密类MessageDigest类代码示例的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。
java messagedigest_Java自带的加密类MessageDigest类代码示例相关推荐
- java messagedigest_Java 自带的加密类MessageDigest类(加密MD5和SHA)
转载 转载自:http://www.tuicool.com/articles/nMNVVj Java 自带的数据加密类MessageDigest(MD5或SHA加密) 说明: 在网站中,为了保护网站会 ...
- Android Java使用JavaMail API发送和接收邮件的代码示例
JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例 使用Javamail发送邮件,必需的j ...
- java中的DES,AES,BASE64,MD5和Cipher类\MessageDigest类
Cipher类位于javax.crypto包下,声明为 public class Cipher extends Object 此类为加密和解密提供密码功能.它构成了 Java Cryptographi ...
- Java日期相关类:Date、SimpleDateFormat和Calendar类常用API代码示例
Date: 表示特定的瞬间,精确到毫秒,他可以通过方法来设定自己所表示的时间,可以表示任意的时间 Date类的构造方法 Date() :创建的是一个表示当前系统时间的Date对象 Date(long ...
- java kryo register_java相关:Kryo框架使用方法代码示例
java相关:Kryo框架使用方法代码示例 发布于 2021-1-21| 复制链接 摘记: Kryo框架的source已移至https://github.com/EsotericSoftware/kr ...
- java修改图片rgb_java图片色阶调整和亮度调整代码示例
对Java图片处理的内容涉猎不深,言辞简陋望请见谅. java实现色阶调整,即调整图片rgb分量,进而也可以调节图片亮度. 测试代码 public static void main(String[] ...
- java treeset 重复_TreeSet判断重复元素解析及代码示例
TreeSet的底层是TreeMap的keySet(),而TreeMap是基于红黑树实现的,红黑树是一种平衡二叉查找树,它能保证任何一个节点的左右子树的高度差不会超过较矮的那棵的一倍. TreeMap ...
- java 四则混合运算_Java实现四则混合运算代码示例
使用栈来实现,可以处理运算优先级. 使用自然四则运算表达式即可,如:4+(3*(3-1)+2)/2.无需把表达式先转换为逆波兰等形式. package com.joshua.cal; import j ...
- java四则混合运算_Java实现四则混合运算代码示例
使用栈来实现,可以处理运算优先级. 使用自然四则运算表达式即可,如:4+(3*(3-1)+2)/2.无需把表达式先转换为逆波兰等形式. package com.joshua.cal; import j ...
- Android+Java中使用Aes对称加密的工具类与使用
场景 Android+Java中使用RSA加密实现接口调用时的校验功能: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/11146 ...
最新文章
- array_filter php5.4 php5.5,PHP 5.4:我可以使用filter_var_array()将多个标志与过滤器一起使用吗?...
- centosx64 6.3安装视频组件
- lwip之数据收发流程_1
- 【ES6专栏】全面解析ECMAScript 6模块系统
- python string模块安装_python String模块-阿里云开发者社区
- Android开发之Android studio4.1查看app布局的方法 | 使用布局检查器和布局验证工具调试布局
- mysql or中有空查询慢_MySQL 慢查询日志
- 历史上的今天:Vue 首次发布;搜狐成立;首个构思集成电路的人出生
- cisco路由器基本实验之六 CHAP and RIP (Boson NetSim)
- 【渝粤教育】国家开放大学2019年春季 2766养羊技术 参考试题
- Linux下的网卡驱动程序的编写过程(转)
- 大学生必备的几个公众号
- RN开发系列<8>--Redux(1)入门篇
- 汇总一下那几个常用定理 高斯定理 泊松方程 亚阈值电流 跨导
- 【HDOJ】3505 Writing Robot
- 构建创新数字基础设施,中泰证券携手华为迈进数字化转型“快车道”
- 企业授权:SOA被低估的经济价值
- 这个屡获大奖的Firefox浏览器又推出新版本啦,完全免费
- 虚拟机有网,主机没有网
- 如何长高青春期后 - 两个简单而成功的方法