JWT的无限可能性:它如何在身份验证、单点登录、API安全等领域发挥作用

整理下工作中常用到的加密解密算法 和 使用场景

一、Base64和UrlBase64

二、Md5 + salt

二、对称加密

四、非对称加密

这节整理 MD5、MD5+salt基本介绍、使用场景及特点,以及java实现机制(文末附代码,需要的自取哈)

二、Md5 + salt

Md5加密 (在线加解密网址 https://www.cmd5.com/)

定义:

(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用以提供消息的完整性保护。

特点:

加密不可逆,即无法通过密文得到原文。

不变性,即相同的原文,通过MD5算法得到的密文总是相同的。

散列性,即对原文作轻微的改动,都可导致最终的密文完全改变。

使用场景:

普通密码管理:

用户明文进行加密后存储DB,登录时比对是否一致(因其已被破解,一般 密码+salt 进行MD5加密存储来提高安全性);

数字签名:

比如对文件中内容MD5加密,如果该文件被篡改,只要重新计算Md5并比对前后的md5值,防止改动内容的"抵赖",即数字签名的作用。

一致性验证:

MD5通过其不可逆的字符串变换算法,产生唯一的MD5信息摘要。

Md5加密 + salt

salt就是一个 随机的字符串

使用方式:

  1. 数据库user表中设置一个slat列,每一次注册用户时,生成一个独一无二的slat(盐)写入数据库slat列,比如手机号作为登录用户ID。

  2. 使用md5+slat的方式进行密码加密,写入数据库password列。

  3. 登录用户时,先根据userid(手机号)获得slat,输入密码和md5+slat加密之后得到的password和数据库password对比,相同,则登入成功。

java实现过程

引入pom

<dependency>

<groupId>commons-codec</groupId>

<artifactId>commons-codec</artifactId>

<version>1.15</version>

</dependency>

java实现Md5加密,Md5+salt加密

public class Md5Util {

private static final String UTF8 = StandardCharsets.UTF_8.name();

/**

* 根据长度n 获取唯一salt值

*

* @param n

* @return

*/

public static String createSlat(int n) {

if (n == 0) return "";

char\[\] chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();

StringBuilder sb = new StringBuilder();

for (int i = 0; i < n; i++) {

char aChar = charsnew Random().nextInt(chars.length);

sb.append(aChar);

}

return sb.toString();

}

/**

* 获取MD5+salt 密文

* @param str password明文

* @param length salt长度

* @return

*/

public static String getMD5CodeBySalt(String str, int length) {

String saltStr = str.concat(createSlat(length));

System.out.println("add salt值后的明文:" + saltStr);

return getMD5Code(saltStr);

}

/**

* 获取MD5 密文

* @param str password明文

* @return

*/

public static String getMD5Code(String str) {

String s = "";

try {

// 对str进行Md5加密

s = DigestUtils.md5Hex(str.getBytes(UTF8));

} catch (Exception e) {

e.printStackTrace();

}

return s;

}

public static void main(String\[\] args) {

System.out.println("不带salt值的MD5加密:明文123456a,秘文:" +

Md5Util.getMD5Code("123456a"));

System.out.println("带salt值的MD5加密:秘文:" +

Md5Util.getMD5CodeBySalt("123456a", 2));

}

}执行效果:

相关推荐
学长毕业设计18 分钟前
基于SpringBoot的瑜伽馆网站的设计与实现(源码+文档+讲解视频)
java·spring boot·后端
一嘴一个橘子20 分钟前
nginx 常用命令(在 nginx 目录下执行)
java
harmful_sheep38 分钟前
java group by常见用法
java·开发语言·python
SKH.43 分钟前
Linux软件编程(6)线程间通信
java·开发语言·数据库
Rain的Java大神之路1 小时前
PC版网站被狂刷怎么处理
java·数据库·redis·后端·mysql·web安全·运维开发
宸津-代码粉碎机1 小时前
AI工程化高阶实战|从Demo到生产落地核心架构、全套源码与避坑指南
java·大数据·开发语言·人工智能·python·架构
泡海椒2 小时前
告别手写 HTTP 模板!JQuick-Curl:直接把 curl 命令跑在 Java 中
java·网络协议·http
珍珠先生2 小时前
第2章 集合框架深度:HashMap 原理与并发集合
java
FreeTinker3 小时前
Java文件服务器的技术选型与实现路径:从嵌入式工具到企业级系统
java·服务器·开发语言
ly76893 小时前
Java 21 到 Java 26 新特性详解:虚拟线程、模式匹配、结构化并发、HTTP/3 与 AOT
java·jvm