面试--你的数据库中密码是如何存储的?

devtools/2025/2/4 1:01:17/

文章目录


在开发中需要存储用户的密码,这个密码一定是加密存储的,如果是明文存储那么如果数据库被攻击了,密码就泄露了。

我们要对数据库的密码进行加密,那么就会问道常用的一些加密算法了。

三种分类

1.对称加密,密钥只有一个,加密和解密都是这个密码。

2.非对称加密,密钥是成对出现了,一个是公钥另一个是私钥。加密和解密使用不同的密钥。加密速度较慢,这个还可以结合 Https 去问.

3.Hash 算法,这是一种不可逆的算法,用于验证数据的完整性。但是可能会被暴力破解

使用 MD5 加密存储

创建一个 MessageDigest 创建一个 md5 的消息摘要,对 123456 进行加密.

public class MD5 {public static void main(String[] args) throws NoSuchAlgorithmException {// 创建一个MD5消息摘要MessageDigest md5 = MessageDigest.getInstance("MD5");// 计算字符串的MD5值byte[] bytes = md5.digest("123456".getBytes());// 输出MD5值for (byte b : bytes) {System.out.printf("%02x", b);}}
}

MD5 加密本身是不可逆向的,也就是不可破解,但可以建立 MD5 加密数据库,把常见的密码加密之后使用数据库存储起来.然后就能够实现破解.这样是非常不安全的.

加盐存储

可以在密码的前面或者后面加一个字符串,然后再进行加密,并且每次加密的都要不一样. 这个字符串叫做盐值,我们把这个盐存储到数据库中去,当用户登录的时候从数据库中再取出这个盐,进行密码的校验.

使用 UUID 生产不重复的字符串.进行加密

public static void main(String[] args) throws NoSuchAlgorithmException {UUID    uuid = UUID.randomUUID();String  str  = uuid.toString().substring(0, 8);// 创建一个MD5消息摘要MessageDigest md5 = MessageDigest.getInstance("MD5");// 计算字符串的MD5值String password = str + "123456";byte[] bytes = md5.digest(str.getBytes());// 输出MD5值for (byte b : bytes) {System.out.printf("%02x", b);}
}

即使相同的密码在数据库中存储的也是不一样的.

Base64 编码:

Base64 编码是将二进制的数据如图片、音频文件等信息打印成字符编码方式,使用 64 个字符 A-Z a-z 0-9 + / 来表示二进制数据。

二进制数据是 8 位一组,表示一个字节的,Base64 编码是按照 6 位一组的,每一个 Base64 编码字符代表 6 位二进制数据。

如果输入的数据不是三字节的的证书背书,会进行填充。

前面带上 前缀 用于在 html 页面中显示对应的图片。图片如果越大,对应的编码长度也就越大。

public  static String prefix = "data:image/png;base64,";
public static String encodeImageToBase64(String imagePath) {
try {// 读取图片文件byte[] imageBytes = Files.readAllBytes(Paths.get(imagePath));// 使用 Java 8 Base64 类进行编码return prefix+Base64.getEncoder().encodeToString(imageBytes);
} catch (IOException e) {e.printStackTrace();return null;
}
}

将生产的 Base64 便阿门直接复制到浏览器中就可以显示出来图片。

用途 用来执着前端页面的验证码信息,使用 Base64 编码。

常见的对称加密算法

只用一个密钥,如果密钥被泄露了那么会出现安全的问题.

https://blog.csdn.net/u014294681/article/details/86690241

常见的非对称加密算法

https://blog.csdn.net/u014294681/article/details/86705999

https 传输加密

https://segmentfault.com/a/1190000021494676

https 在交换证书的时候使用的是非对称加密,在传输过程中使用的还是对称加密的方式.


http://www.ppmy.cn/devtools/155865.html

相关文章

Spring MVC 框架:构建高效 Java Web 应用的利器

Java学习资料 Java学习资料 Java学习资料 一、引言 在 Java Web 开发领域,Spring MVC 框架是一颗耀眼的明星。它作为 Spring 框架家族的重要成员,为开发者提供了一套强大而灵活的解决方案,用于构建 Web 应用程序。Spring MVC 遵循模型 - 视…

12 向量结构模块(vector.rs)

一vector.rs源码 // Copyright 2013 The Servo Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE…

如何用微信小程序写春联

​ 生活没有模板,只需心灯一盏。 如果笑能让你释然,那就开怀一笑;如果哭能让你减压,那就让泪水流下来。如果沉默是金,那就不用解释;如果放下能更好地前行,就别再扛着。 一、引入 Vant UI 1、通过 npm 安装 npm i @vant/weapp -S --production​​ 2、修改 app.json …

Hive:日志,hql运行方式,Array,行列转换

日志 可以在终端通过 find / | grep hive-log4j2 命令查找Hive的日志配置文件 这些文件用于配置Hive的日志系统。它们不属于系统日志也不属于Job日志&#xff0c;而是用于配置Hive如何记录系统日志和Job日志, 可以通过hive-log4j2 查找日志的位置 HQL的3种运行方式 第1种就是l…

强化学习数学原理(四)——蒙特卡洛方法

一、蒙特卡洛方法 蒙特卡洛方法是一种无模型&#xff08;Model-Free&#xff09;的强化学习算法&#xff0c;它通过直接与环境交互采样轨迹&#xff08;episodes&#xff09;来估计状态或动作的价值函数&#xff08;Value Function&#xff09;&#xff0c;而不需要依赖环境动态…

2025年2月2日(tcp_server_socket.listen(128))

tcp_server_socket.listen(128) 是 Python 中用于设置 TCP 服务器套接字&#xff08;socket&#xff09;在监听传入连接时的最大连接数。 具体来说&#xff1a; tcp_server_socket 是一个通过 socket.socket() 创建的服务器套接字。listen() 方法用于将套接字设置为“监听模式…

wax到底是什么意思

在很久很久以前&#xff0c;人类还没有诞生文字之前&#xff0c;人类就产生了语言&#xff1b;在诞生文字之前&#xff0c;人类就已经使用了语言很久很久。 没有文字之前&#xff0c;人们的语言其实是相对比较简单的&#xff0c;因为人类的生产和生活水平非常低下&#xff0c;…

LM Studio windows系统断网教程,通过防火墙禁止联网

使用LM Studio 进行大模型的使用&#xff0c;有时候需要断网&#xff0c;下面是断网教程 1、找到文件位置 右键LM Studio &#xff0c;查看起始位置 2、在搜索里搜防火墙&#xff0c; 打开高级安全Windows Defender防火墙 打开之后如图所示 3、入站规则处理 3.1、LM S…