你的数据库到底应该如何存储密码?

数据泄露防范:保护个人隐私和敏感信息的最佳实践 随着数字化时代的到来,个人隐私和敏感信息的保护变得尤为重要。数据泄露事件频繁发生,给个人和企业带来了巨大的损失和风险。本文将介绍一些保护个人隐私和敏感信息的最佳实践,包括加密、访问控制、安全审计等方面的技术和策略。通过采取这些措施,我们可以最大程度地减少数据泄露的风险,并保护个人和企业的利益。 阅读详情

最近接手公司一个之前的服务,竟然发现用户密码是明文存储在数据库中!

说实话还是有点吃惊的,这可不兴学 优快云 呀(手动狗头),至少也得搞个 MD5 存一存吧。

不过 MD5 其实也没啥用,今天我们就来盘盘密码这种敏感信息该如何存储。

数据库为什么不能明文存储密码

不仅仅是为了防止系统管理员或者DBA等公司人员获得用户的密码,也是防止被黑客拖库产生更大的信息泄露。

如果黑客通过不法手段获取了服务的数据库存储信息,盗取里面的内容,从而直接获得明文密码,那么影响就会很大。

​因为绝大部分人所有账户的密码都会设置成一样的,只要知道一个网站的明文密码后,基本上等于搞定这个用户其他网站的所有账号,也就是撞库。

所以不能明文存储密码,需要加密下。

MD5 不是加密算法

实际上,经常有人会说拿 MD5 加密,这样说没问题,但是我们心里要清楚 MD5 压根就不是加密算法,它其实就是个摘要算法。

加密算法指的是把一段数据加密后,可以解密。

很明显 MD5 无法解密,只能暴力穷举破解,所以它不算是加密算法。

为什么用 MD5 存储密码不好

大部分人的密码都会设置得比较简单,比如名字缩写加个出生日期这种。

而黑客其实会针对常见的一些密码,生成彩虹表。

彩虹表:是用于加密散列函数逆运算的预先计算好的表,常用于破解加密过的密码散列(维基百科)

就像下面的表格:

​这样一来只要准备得足够充分,彩虹表足够大,那么直接对比彩虹表就能反推得出明文密码,所以直接简单用 MD5 也是不安全。

给密码加点盐

那咋办么?

其实彩虹表大部分能找到的只是常见的密码。

基于这点,我们虽然不能强迫用户设置一些非常复杂的密码(这记忆成本太高)。

但是我们可以手动给用户的密码拼接上一些复杂的字符,然后经过哈希函数处理之后落库。

比如用户初始密码是123456,我们可以给他的密码加点盐,盐其实就是一些复杂的字符数字,比如:

​这样即使不法分子盗取到密码,预先准备的彩虹表(因为密码变得不常见了)也无用,使得破解的成本变高。

这种盐叫固态盐,不需要落库存储,一般在代码或者配置中保存。一旦被不法分子试出这个的盐,那么继而就能通过这个盐试出别的密码。

所以推荐动态盐,即让每个账号下密码加的盐都是不一样的,这样一来不法分子的破解成本就更高了。

​动态盐需要分别为每个用户记录对应密码加的盐值,一般是落库存储,比如上图所示在用户表上加个 salt 字段。

又或者直接跟密码拼一起中间用特殊符号切分等等,比如下图用 $ 来分割。(没错动态盐是直接存储的,也就是说攻击者可以拿到每个账号的盐)。

​我还看过一些方案,比如不加字段也不用分隔符,把用户的创建时间进行处理作为动态盐,等等。

加盐这种手段仅仅只是增加了攻击者的破解成本,因为攻击者知道盐值,从而就能反推出一个值,使得这个md5(值+盐) = md5(密码+盐)。

​因为不论这个值是否等于密码,反正只要最终 hash 的结果是一样的,就都能登录,所以攻击者要推是可以推出来的,只不过成本会高些。

总而言之,通过摘要算法来存储密码,不法分子是可以通过暴力、彩虹表、字典等方式来破解。

如果你仅仅是用 md5 处理密码存储,那么这些破解其实成本也不是很大,咋一说你可能没啥感觉,我在网上看到一个结论:md5 来存储 6 位长度的密码(仅仅包含小写和数字),只需要 40 秒,就可以穷举所有密码。

bcrypt

因此,为了进一步给黑客们增加破解成本,需要替换 md5 这类 hash 快速的方法,换成 bcrypt 这种算法。

md5 计算只需要 1 微妙,而 bcrypt 需要 0.3 秒,速度差了 30 万倍。

1秒=1000000 微秒

因此,如果本来 40 秒就能破解的话,换成 bcrypt 后变成 138 天才能破解!

bcrypt 就是这么个哈希算法,它有个迭代次数,可以使得计算变慢,非常适合这种场景!

不用摘要算法,加密存储行吗?

其实还有一种防破解的方式,就是采用加密算法。

比如采用对称加密 AES,这样只要密钥不泄露,攻击者拖库拿到密码也完全破解不了!

但是反过来想,假设密钥被泄漏了,那就是白给,比破解上述的hash(密码+盐)更轻松,连试试都不需要。

所以加密存储的话就得看你的密钥保不保得住了。

最后

大致方案就这么几种。动态盐其实已经 OK 了,不过算法尽量别用 md5,可以用 sha1、sha256 这些,因为 md5 其实已经被破解了。

这里的破解不是说通过 md5 可以反向推出明文,而是利用 md5 hash 后的值能快速的找到另一个值使得 md5 的结果一致。

好了,今天这篇就说这么多了,更多的可以自行上网查阅。

md5 和 bcrypt 的速度对比来源下面这篇文章:

  • https://coolshell.cn/articles/2078.html

如何在数据库中安全地存储密码 本文详细解析了密码存储的安全机制——加盐哈希技术。通过图示展示了从用户输入密码到安全存储的全过程:系统随机生成盐值,与密码拼接后进行哈希运算,最终只存储哈希值和盐值。文章强调了盐值的唯一性和随机性,以及使用专业密码哈希算法(如Argon2id、bcrypt)的重要性,指出这些算法具有计算缓慢、内存消耗大的特点,能有效抵御暴力破解。同时提出了pepper(胡椒)作为额外安全层的概念,建议将其存储在独立的安全管理系统而非数据库中。最后给出了Delphi语言的实现示例,并提醒要避免常见安全误区,如使用快速哈希算法 阅读详情

相关推荐

MySQL数据库存储密码(Python加密)

在MySQL数据库中存储密码时,重要的是要确保这些密码以安全的方式被加密或哈希处理,以防止未授权访问。MySQL本身不直接提供密码存储的加密功能,但你可以通过应用程序逻辑或者MySQL的加密函数来实现。不过,对于密码存储,最常见和推荐的方法是使用哈希算法,如SHA-256或bcrypt,因为哈希是单向的,这意味着一旦数据被哈希,就不能逆向恢复到原始数据。

蜡笔小新星的博客 1406

最后的防线:数据存储加密方案

本文介绍了常见的 6 种数据存储加密方案,附对比表。

2万+

【MATLAB强化学习工具箱】学习笔记--在Simulink环境中训练智能体Create Simulink Environment and Train Agent

Simulink中便于搭建各类动力学与控制模型,通过将原有的控制器替换为AI控制器,可以方便使用已有模型,提供增量效果。 本节的重点是如何引入Simulink模型作为env,其他的内容在之前的文章中已有说明。 以水箱模型watertank为例,如下图所示: 采用PI控制器,控制效果如下所示: 将此PI控制器替换为神经网络控制器后,系统架构如下图所示: 具体替换策略如下所示: (1)删去PID控制器; (2)增加RL Agent模块; (3)观测器模块: 观测向量为:,其中...

bear_miao的博客 1万+

如何实现数据的加密存储?

  随着信息时代的发展,数据安全已成为企业和个人不可忽视的重要问题。在处理敏感数据时,保护数据安全是必须的,而将数据进行加密存储是一个常见的选择。本文安策科技将介绍如何实现数据的加密存储。   一、什么是数据加密存储   数据加密是指对数据进行一定的变换,使其变为一种更难解读的形式。数据加密存储就是在存储数据之前,对数据进行加密处理,将加密后的数据存储到数据库或文件中。这样,即使数据被非法窃取,也无法从数据本身中获取有价值的信息。   二、数据加密算法   1. 对称加密算法   对称加密算法是最

SafePloy_SH的博客 3751

AppleAccount注册之生成sign

根据日志发现:签名来自于AuthKit的-[AKAppleIDServerResourceLoadDelegate signRequest:withCompletionHandler:]的一个block,这个库是放在共享缓存库里的,找到提前准备好的IDA文件,先去找主方法,根据分析IDA,最后找到了实际生成签名的方法:t1。,接受五个参数,context(之前讲的获取到的客户端证书),bytes(待加密的body字节),length(字节长度),以及两个接受结果的参数,直接进这个方法看,

2503_90751938的博客 1009

Codex VS Claude Code 全面测评!代码开发到底选谁?

评测结果6项指标(设计质量、提示遵从度、响应式、代码质量、细节关注、惊喜度)虽未公布最终赢家,但实测本身已揭示两工具在前端任务上的直接差异。Codex基于OpenAI的云沙箱架构,API通过全球CDN分发,但在国内直连时,依赖特定网络环境。:纯终端工具,直接在你的iTerm或终端中运行,不新建窗口、不切换上下文,与本地开发环境无缝融合。GPT-5.3 Codex(xhigh)输入$1.75/百万token,输出$14.00/百万token,混合均价约**$4.81/百万token**。

Jedudu的博客 3091

数据加密存储都包含哪些

常见的数据存储加密方法有以下5种1.数据加密存储:文件级加密 文件级加密可以在主机或网络附加存储这一层以嵌入式的方法实现,但文件级加密会引起性能问题;在执行数据备份操作时,会带来某些局限性。2.数据加密存储:数据库级加密。3.数据加密存储:介质级加密4.数据加密存储:嵌入式加密设备 嵌入式加密设备是放在存储区域网中的,介于存储设备和请求加密数据的服务器之间,嵌入式加密设备可以对存储设备的数据进行加密,且可以保护静态数据,但嵌入式加密设备扩展难度大,成本高。5.数据加密存储:应用加密

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 4518

SAP系统中PP模块全配置文档

配置路径IMG>SAP NetWeaver>常规设置>维护日历>工厂日历事务代码SCAL要求传输工厂代码描述日历代码日历描述起始日期星期一星期二星期三星期四星期五星期六星期日有效开始日期有效结束日期1000南微医学工厂MT南微医学工厂日历√√√√√√√201820502.4定义工厂配置路径IMG>生产>物料清单>常规数据>定义BOM状态事务代码OS23要求传输配置路径IMG>生产>主数据>资源>常规数据>标准值>定义参数。

yanzibing99的博客 1894

数据加密存储常见的加密方式

数据加密存储五种常见的加密方式先总结下:数据加密存储五种常见的加密方式:数据加密存储方式一、MD5加密(加密不可逆)。数据加密存储方式二、Base64位加密(可加密也可解密)。数据加密存储方式三、sha1加密(加密不可逆)。数据加密存储方式四、RSA加密(公钥加密,私钥解密)。数据加密存储方式五、AES加密(需要密钥才能解密)

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 6974

西门子1200PLC编程实战:OB、FC、FB与DB的深度解析与应用技巧

本文深度解析西门子1200PLC编程中OB、FC、FB与DB四大核心功能块的应用技巧。通过工厂化比喻,阐明OB作为程序总调度、FC作为可重用函数、FB作为带记忆的智能设备以及DB作为数据仓库的角色与关系,并提供实战技巧,帮助工程师构建结构清晰、易于维护的高效PLC程序。

weixin_29280657的博客 444

YOLOv11改进,YOLOv11结合DynamicConv(动态卷积),CVPR2024,二次创新C3k2结构

DynamicConv(动态卷积)是一个用于提高卷积神经网络(CNN)性能的技术,核心思想是动态地生成卷积核(filter),而不是使用固定的卷积核。通过引入更多的计算灵活性和适应性来增强卷积操作的表达能力,进而提升模型的性能。专家选择:DynamicConv 通过引入多个“专家”(experts),每个专家学习特定的卷积模式。输入图像的不同部分会选择不同的专家进行卷积。动态卷积核生成:根据输入的不同特征,专家网络动态地生成卷积核,而不是使用固定的卷积核。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2266

如何在数据库中存储用户密码_如何在数据库中存储密码

如何在数据库中存储用户密码You don’t. You don’t store passwords in the database. You store the password hash, a string generated from the password, but from which no one can go back to the original password value. ...

cuk0051的博客 3374

易盾滑块的js逆向分析

基于易盾的滑块验证码进行逆向分析,最种实现全系列的验证码逆向,包括滑块、点选、推理拼图等多种类型。

shanf7921的博客 3万+

面试官:你们是如何在数据库中存储密码?

我有一个朋友,姑且就先称呼他为小王吧,前几日,小王去面试; 面试官问:如何在数据库中存储密码?

2422

[QMT量化交易小白入门]-七十一、十年回测ETF动量策略,超额年化收益率为10.6%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1862

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

一文教你如何在数据库中安全地存储密码

前言作者:神的孩子在歌唱大家好,我叫智让我们先谈谈什么不该做。不要以存储密码。任何具有数据库内部访问的人都可以看到它们。如果,攻击者可以轻松获取所有密码。那么,我们应该如何在数据库中安全地存储密码呢。

xnxqwzy的博客 3054

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数据库密码哈希存储

在构建登录注册系统时,安全性是最重要的考量之一。直接将用户的明文密码存储在数据库中是不安全的,因为一旦数据库泄露,用户的密码就会暴露。为了解决这个问题,我们可以使用密码哈希(加密)存储方式。的方式存储密码,我们不仅保护了用户的敏感信息,还大大提高了系统的安全性。哈希是一种不可逆的加密方式,即通过算法加密后的结果无法直接还原成原来的数据。是 PHP 提供的一个内置函数,专门用于安全地存储密码,它默认使用。将用户输入的明文密码加密后存储。函数来验证用户的输入密码是否匹配数据库中的哈希密码。

airCyan_的博客 935

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

ngczx的博客 2939

数据库密码存储

https://blog.youkuaiyun.com/a273967581/article/details/84909876 就说原密码加上一个盐值一起hash存储起来的,当然不能说还存储了明文,不然肯定会被喷。 Web安全--使用Salt + Hash将密码加密后再存储进数据库 https://www.cnblogs.com/wphl-27/p/5959049.html 解决的办法是将...

sun007700的专栏 1043

java数据库密码存储_java – 如何在数据库中存储密码?

我在我的Web应用程序中使用jsp和servlet.我需要在数据库中存储密码.我发现哈希将是最好的方法.我用这个代码来做.String user = request.getParameter("Username");String pass = request.getParameter("Password1");String name = request.getParameter("Name");S...

weixin_31600305的博客 941

安全面试中的一个基本问题:如何在数据库中存储密码?

简短解释一下。字典表。在彩虹表之前,攻击者会预先计算所有的哈希值,并将所有的哈希值枚举到一个叫做“字典表”的表中。然后在获取目标数据库表后,进行哈希碰撞并获取链接的原始密码值(再次强调,这就是盐如此重要的原因)然而,字典表可能会增长得非常快,最终会因行数过多而变得无法使用。彩虹表可以被认为是“字典表的高效版本”在彩虹表中,有 2 个函数。H:从明文获取哈希值,R:从哈希值获取明文存储多行。每行都是一个“散列链”,每行都以纯文本开始,然后多次进行 H 和 R。

qq_28791753的博客 943

java项目用户密码存储到数据库需要加密

给大家整理了一些有关【存储,数据库】的项目学习资料(附讲解~~):https://edu.51cto.com/course/30358.htmlhttps://edu.51cto.com/course/33749.html以一些关于【数据库】的学习资料和大家一起分享一下:https://edu.51cto.com/v...

weixin_26879037的博客 334

python数据库密码如何加密_如何在数据库中存储加密后的密码?

在我们日常开发运维平台中,如果公司对安全要求比较高,一般数据库中都存储的都是用户加密后的密码,这样即使某些人侥幸得到数据库权限,也无法得知用户明文密码,这主要是从安全角度来考虑的,那如何将用户输入的明文密码转为加密后的密码呢? 我们今天这篇文章就给出一个小例子,让大家看看如何实现,按惯例,我们先上代码:#!/usr/local/env pythonimport sysimport hashlibi...

weixin_39629093的博客 1153

数据库到底应该如何存储密码?

其实还有一种防破解的方式,就是采用加密算法。比如采用对称加密 AES,这样只要密钥不泄露,攻击者拖库拿到密码也完全破解不了!但是反过来想,假设密钥被泄漏了,那就是白给,比破解上述的hash(密码+盐)更轻松,连试试都不需要。所以加密存储的话就得看你的密钥保不保得住了。大致方案就这么几种。动态盐其实已经 OK 了,不过算法尽量别用 md5,可以用 sha1、sha256 这些,因为 md5 其实已经被破解了。

2401_83384536的博客 705

你的数据库密码还在使用明文存储?来看看这篇吧。

如何使用 SpringBoot 实现盐加密

程序员李民才的博客 2749

数据库关于密码存储

    以前自己写网站玩的时候,真是一点都不考虑安全性,虽然也象征性的md5了一下,然后登陆了也是拿出这个md5值和输入的密码进行md5以后比较,这个方法没什么大问题,除了说md5可能会有冲突之类的情况。但是呢,当时有一个最严重的问题,就是把密码明文也存储了,虽然这个明文对于用户来说永远也使用不到,用户登陆也是和md5以后的密码比较。我也很清楚不应该存储明文的,但是想着存了也无所谓,也不浪费什...

hello world 3698
上一篇: SpringBoot中如何实现业务校验,这种方式才叫优雅!
下一篇: 纯干货!Java后端开发十二条经验分享!
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值