使用MD5进行加密解密【代码实现】
目录
为什么需要加密?
MD5加密测试
第一种加密方式
第二种加密方式
JUnit测试
为什么需要加密?
主要是保证网络传输数据的安全性。
我们的数据需要存储到前端,对于用户来说,不应该知道我们的敏感信息
在正式环境,我们的数据需要通过网络传输,必须要保证数据在网络传输的安全性,所以我们要采用加密的方式进行传输
明文:加密之前的内容,原始内容
暗文:加密之后的内容
公钥:可见的公共的钥匙
私钥:不可见的私有的钥匙
不可逆加密算法
特征:只能加密不能解密
技术:md5
作用:一般对登录密码处理,用于做密码比对
问题:只能加密,不能解密,不能用来对网络中传输的数据进行加密
可逆对称加密算法
特征:
1. 可以加密,也可以解密
2. 加密和解密的密钥是同一个
实现:DES,AES
作用:对数据库密码进行加密
算法:
密文为s,加解密算法为AES,秘钥为k,明文为c
加密:s = AES(k,c)
解密:c = AES(k,s)
问题:
1. 数据可能会被其他人解密
2. 数据可能会被篡改
RSA,RSA2:**可逆非对称加密算法【这个最好-用这个】**
特征:
1. 可以加密,也可以解密
2. 加密和解密的密钥不是同一个。但是是成对出现的。一个私钥就对应一个公钥。如果使用私钥加密,
只能使用与之对应公钥来解决。反之如果使用公钥加密,只能使用与之对应私钥解密
作用:网络传输中对数据进行加解密
算法:
密文为s,加解密算法为RSA私钥为k1,公钥为k2,明文为c
第一组:私钥加密公钥解密
加密:s = rsa(k1,c)
解密:c = rsa(k2,s)
第二组:公钥加密私钥解决
加密:s = rsa(k2,c)
解密:c = rsa(k1,s)
注意:加密一次不安全,要加密两次,解密两次。第一次加密和解密并不是真正的数据,而是数字签名和签名认证/确认身份【确认不成功会返回false】
权限控制需要使用到的技术
JWT令牌[JSON web Token]
RSA加密算法
Router动态路由
Vue自定义指令
MD5加密测试
思路:当平时我们在注册的时候需要对密码进行加密,然后存储到数据库,当我们进行第一次登录的时候需要进行校验,使用同样的方式对用户输入的密码进行加密然后和数据库获取的密码进行equals比较,如果返回值是true说明密码正确,返回为false,说明密码错误。
第一种加密方式
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class MD5Utils {/*** MD5加密 通过将盐值和密码进行加密,进行混淆* 登录的时候就通过密码和数据库中的盐值进行拼接 进行MD5加密后的结果是否相同* @param context*/public static String encrypByMd5(String context) {try { MessageDigest md = MessageDigest.getInstance("MD5");md.update(context.getBytes());//update处理 byte [] encryContext = md.digest();//调用该方法完成计算 int i; StringBuffer buf = new StringBuffer(""); for (int offset = 0; offset < encryContext.length; offset++) {//做相应的转化(十六进制) i = encryContext[offset]; if (i < 0) i += 256; if (i < 16) buf.append("0"); buf.append(Integer.toHexString(i)); } return buf.toString();} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch block e.printStackTrace();return null;} }public static void main(String[] args) {//加密//1 生成随机盐值String pwd = "1";String salt = StrUtils.getComplexRandomString(32);//2 通过这个盐值加密String md5Pwd = MD5Utils.encrypByMd5(pwd +"yhp"+ salt+"xxxx");System.out.println(md5Pwd);//密码比对//1 查询盐值-就是saltString saltTmp = salt;//3 加密比对String pwdTmp = "1";String inputMd5Pwd = MD5Utils.encrypByMd5(pwdTmp +"yhp"+ saltTmp+"xxxx");if (inputMd5Pwd.equals(md5Pwd)){System.out.println("登录成功!");}else{System.out.println("密码错误");}}
}
第二种加密方式
注意:MD5 算法通常用于加密而不是解密,因为它是不可逆的哈希函数。这里所说的“解密”实际上是指破解 MD5 加密的哈希值。
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class MD5Util {// 加密方法:接收一个字符串明文,返回使用 MD5 加密后的哈希值public static String encrypt(String plaintext) throws NoSuchAlgorithmException {// 使用 MD5 算法创建 MessageDigest 对象MessageDigest md = MessageDigest.getInstance("MD5");// 更新 MessageDigest 对象中的字节数据md.update(plaintext.getBytes());// 对更新后的数据计算哈希值,存储在 byte 数组中byte[] digest = md.digest();// 将 byte 数组转换为十六进制字符串StringBuilder sb = new StringBuilder();for (byte b : digest) {sb.append(String.format("%02x", b & 0xff));}// 返回十六进制字符串return sb.toString();}// 解密方法:接收一个字符串明文和一个使用 MD5 加密后的哈希值,返回解密结果(true 表示匹配,false 表示不匹配)public static boolean decrypt(String plaintext, String encrypted) throws NoSuchAlgorithmException {// 调用加密方法计算出明文的哈希值String decrypted = encrypt(plaintext);// 比较计算得到的哈希值和输入的哈希值是否相同return decrypted.equals(encrypted);}
}
这个类实现了两个静态方法:encrypt()
和 decrypt()
。encrypt()
方法将输入的明文字符串使用 MD5 哈希算法加密,并返回其哈希值的十六进制表示形式。decrypt()
方法将输入的明文字符串和哈希值与使用 encrypt()
方法计算出的哈希值比较,如果相同则返回 true
,否则返回 false
。由于 MD5 哈希算法是不可逆的,所以它是无法直接进行解密的,decrypt()
方法的实际作用是通过试图暴力破解哈希值来验证一组明文和哈希值是否匹配。
在 encrypt()
方法中,我们使用 MessageDigest
类来创建一个 MD5 消息摘要对象。然后,我们在对象上调用 update()
方法来更新摘要数据,并在调用 digest()
方法时计算哈希值。digest()
方法返回一个 byte 数组,其中包含计算出的哈希值。我们使用 StringBuilder
对象将此数组转换为一个十六进制字符串,并返回结果。
在 decrypt()
方法中,我们只需要在内部调用 encrypt()
方法来计算明文的哈希值,并将其与输入的哈希值进行比较即可。我们使用 equals()
方法来比较字符串相等性,因为这是一种比较字符串内容的安全和可靠的方法。
JUnit测试
import java.security.NoSuchAlgorithmException;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;public class MD5UtilTest {/*** 测试加密* */@Testpublic void testEncrypt() throws NoSuchAlgorithmException {String plaintext = "hello world";String expected = "5eb63bbbe01eeed093cb22bb8f5acdc3";//进行加密String actual = MD5Util.encrypt(plaintext);Assertions.assertEquals(expected, actual);System.out.println("加密是否成功:"+expected.equals(actual));}/*** 进行解密* */@Testpublic void testDecrypt() throws NoSuchAlgorithmException {String plaintext = "hello world";String encrypted = "5eb63bbbe01eeed093cb22bb8f5acdc3";boolean expected = true;boolean actual = MD5Util.decrypt(plaintext, encrypted);Assertions.assertEquals(expected, actual);System.out.println("解密是否成功:"+actual);}
}
使用MD5进行加密解密【代码实现】相关推荐
- 转载并学习实现三重DES加密解密代码(一)
作者:finallyliuyu 出处:博客园 声明:此篇博文代码来自于邹德强先生.由于目前找到的版本是残缺版,所以我又进行了补全.读一份好代码,可以领略到作者的编程风格和语言驾驭能力,同时又能从其中汲 ...
- md5在线加密解密是不是什么都能解密?为什么我的没有解出来呢?
网上有很多md5在线加解密站,熟悉网络安全或者IT技术的朋友可能会比较熟悉.MD5是一种加密技术方法.MD5的全称是Message-digest Algorithm 5,也称为信息摘要算法.主要是用于 ...
- php结合md5的加密解密,php结合md5的加密解密算法实例
本文实例讲述了php结合md5的加密解密算法.分享给大家供大家参考,具体如下: /* * Created on 2016-9-30 * */ function encrypt($data, $key) ...
- md5视频加密 java代码,Java实现MD5加密及解密的代码实例分享
基础:MessageDigest类的使用 其实要在Java中完成MD5加密,MessageDigest类大部分都帮你实现好了,几行代码足矣: /** * 对字符串md5加密 * * @param st ...
- java 采用MD5加密解密代码示例(不玩套路, 非标题党, 附带解密代码)
package cn.demo; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; im ...
- php结合md5的加密解密,php结合md5实现的加密解密方法
本文实例讲述了php结合md5实现的加密解密方法.分享给大家供大家参考,具体如下: 最近在整理代码发现了一个不错的东西,结合md5的加解密算法.网上关于php结合md5的加密,解密算法比较少的,其实p ...
- php结合md5的加密解密,php结合md5实现的加密解密方法_PHP
本文实例讲述了php结合md5实现的加密解密方法.分享给大家供大家参考,具体如下: 最近在整理代码发现了一个不错的东西,结合md5的加解密算法.网上关于php结合md5的加密,解密算法比较少的,其实p ...
- php结合md5的加密解密,php结合md5实现的加密解密方法,php结合md5加密解密_PHP教程...
php结合md5实现的加密解密方法,php结合md5加密解密 本文实例讲述了php结合md5实现的加密解密方法.分享给大家供大家参考,具体如下: 最近在整理代码发现了一个不错的东西,结合md5的加解密 ...
- php结合md5的加密解密,php结合md5实现的加密解密方法_php技巧
本文实例讲述了php结合md5实现的加密解密方法.分享给大家供大家参考,具体如下: 最近在整理代码发现了一个不错的东西,结合md5的加解密算法.网上关于php结合md5的加密,解密算法比较少的,其实p ...
- java加密解密代码_base64位加密解密原理及js代码实现
base64位加密解密原理及js代码实现 在网上找了很多关于Base64加密解密的原理以一个比较通俗易懂的方式理解整理了一下大致原理如下 先上base64对照表 #加密 #1:将明文对照以acsii码 ...
最新文章
- CPU实模式和保护模式、全局描述符表GDT、Linux内核中GDT和IDT的结构定义
- Leetcode每日必刷题库第6题,如何实现字形变换?
- PostgreSQL(一)PostgreSQL一主二从集群部署
- Catlike Coding网站文章解析 -- 2.Procedural Grid
- DataTextField和DataValueField的区别
- java 封装的概念_java封装的概念
- python类加载_如何重新加载一个类在python shell?
- centos 安装图形桌面
- python怎么读取dat类型文件_基于python批量处理dat文件及科学计算方法详解
- pascal-5i 数据集
- MySQL查询指定日期时间语句大全
- python +高德地图API调用
- 超标量处理器设计 姚永斌 第7章 寄存器重命名 摘录
- 什么是轻量应用服务器
- 深度学习——UMRL
- 英文论文如何看?转自知乎
- CentOS7出现a problem has occured and the system can‘t recover
- 智能财务报表OCR识别系统
- 二维平移旋转变换及其特性
- DeepLearning: 归纳几种常用的激活函数(activation)