当前位置: 首页 > article >正文

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

文章目录

      • 三种分类
      • 使用 MD5 加密存储
      • 加盐存储
      • Base64 编码:
      • 常见的对称加密算法
      • 常见的非对称加密算法
      • https 传输加密

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

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

三种分类

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.kler.cn/a/512761.html

相关文章:

  • python milvus及curl命令进行query请求
  • 奉加微PHY6230兼容性:部分手机不兼容
  • Ceph与RAID在存储中的协同工作过程
  • Git:问题解决办法 及 Tips 总结
  • 网络变压器的分类
  • AudioGPT全新的 音频内容理解与生成系统
  • 《offer 来了:Java 面试核心知识点精讲 -- 框架篇》(附资源)
  • 【Elasticsearch】分片与副本机制:优化数据存储与查询性能
  • 在Windows/Linux/MacOS C++程序中打印崩溃调用栈和局部变量信息
  • C/C++ 时间复杂度(On)
  • 读西瓜书的数学准备
  • 【Java】探秘二叉树经典题,码农进阶“必刷清单”在此!(上)
  • 【Spring MVC】如何运用应用分层思想实现简单图书管理系统前后端交互工作
  • Leetcode 3428. Maximum and Minimum Sums of at Most Size K Subsequences
  • 【数据分享】1929-2024年全球站点的逐日最高气温数据(Shp\Excel\免费获取)
  • AI音乐生成模型Suno的技术原理,以及Suno的使用指南与应用场景
  • B3DM转换成STEP
  • 解决leetcode第3426题所有安放棋子方案的曼哈顿距离
  • Elasticsearch(ES)基础查询语法的使用
  • spring Ioc 容器的简介和Bean之间的关系
  • 一文大白话讲清楚webpack基本使用——4——vue-loader的配置和使用
  • AI编程工具横向评测--Cloudstudio塑造完全态的jupyter notebook助力数据分析应用开发
  • Java基于SSM框架的社区团购系统小程序设计与实现(附源码,文档,部署)
  • xiaozhi-esp32 - 基于 ESP32 的 AI 聊天机器人
  • 2024年博客之星主题创作|Android 开发:前沿技术、跨领域融合与就业技能展望
  • 深入探索 Vue.js 的局部状态管理技术:基于 Pinia 的组合式 API 实现