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

news/2025/2/5 21:48:34/

文章目录


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

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

三种分类

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/news/1569615.html

相关文章

大模型高级工程师实践 - 将课程内容转为视频

通过整合之前生成的文字、音频、PPT,我们能够制作出引人入胜的科普课程视频,使表达更加生动且多样化。本节课程将介绍如何利用音视频处理工具ffmpeg和moviepy,快速将课程内容转化为视频。 1. 原理介绍 当前的大模型文生视频或图生视频方案还…

基于“蘑菇书”的强化学习知识点(五):条件期望

条件期望 摘要一、条件期望的定义二、条件期望的关键性质三、条件期望的直观理解四、条件期望的应用场景五、简单例子离散情况连续情况 摘要 本系列知识点讲解基于蘑菇书EasyRL中的内容进行详细的疑难点分析!具体内容请阅读蘑菇书EasyRL! 对应蘑菇书Eas…

Linux_线程同步生产者消费者模型

同步的相关概念 同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,叫做同步竞态条件:因为时序问题,而导致程序异常,我们称之为竞态条件。 同步的…

CentOs9新手教程

CentOS 9是基于RHEL的CentOS Stream版本,主要用于开发和测试环境,不适合作为生产环境的稳定系统。它提供了最新的软件和功能,但可能存在不稳定性和兼容性问题。如果你需要一个稳定的生产环境,建议使用CentOS Linux版本。 安装环境…

4 前端前置技术(中):node.js环境

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 前言

使用PaddlePaddle实现逻辑回归:从训练到模型保存与加载

1. 引入必要的库 首先,需要引入必要的库。PaddlePaddle用于构建和训练模型,pandas和numpy用于数据处理,matplotlib用于结果的可视化。 import paddle import pandas as pd import numpy as np import matplotlib.pyplot as plt 2. 加载自定…

C语言内存之旅:从静态到动态的跨越

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一 动态内存管理的必要性二 动态…

《手札·开源篇》从开源到商业化:中小企业的低成本数字化转型路径 ——SKF轴承贸易商的十年信息化演进启示

一、战略驱动的数字化演进逻辑 在轴承行业利润持续走低的背景下,我们选择了一条"开源筑基-场景突破-数据驱动"的演进路径。从2013年金蝶EAS的基础供应链管理,到2023年实现车间设备全要素数字化,系统建设始终遵循"业务场景驱动…