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

本文探讨了为何不应明文存储用户密码,解释了MD5作为摘要算法的局限性,以及使用加盐哈希提高密码安全性的重要性。介绍了动态盐的概念,增加了破解密码的难度。最后提到了bcrypt算法如何进一步增加黑客破解成本,并讨论了加密存储的优缺点。建议使用bcrypt替代快速哈希算法,并强调了密钥管理在加密存储中的关键作用。

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

说实话还是有点吃惊的,这可不兴学 CSDN 呀(手动狗头),至少也得搞个 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

<think>嗯,用户问的是黑马苍穹外卖项目的管理端登录设置密码是否必须使用自己登录数据库密码。首先,我需要理解这个问题的背景。可能用户在学习这个项目时遇到了配置上的问题,或者担心密码安全性。 首先,我应该回忆一下常见的Web应用架构。通常,管理端的登录密码数据库密码是分开的。管理端密码是用于后台管理系统的用户认证,而数据库密码是用于应用连接数据库的凭证。两者存储的位置和用途不同,所以一般来说不需要相同。 接下来,考虑苍穹外卖项目的具体情况。根据黑马课程的内容,这个项目可能采用的是Spring Boot框架,结合Spring Security或者Shiro进行权限管理。管理端的用户信息应该存储数据库中的某张表里,比如employee表。用户登录时,应用会从该表中查询用户名和加密后的密码进行验证。而数据库的连接信息,如密码,通常配置在application.properties或application.yml文件中,用于JDBC连接。 这时候需要确认用户是否有混淆这两个密码的可能。例如,用户可能误以为在管理端登录时需要输入数据库密码,或者在配置文件中设置的数据库密码必须和管理员账户的密码一致。实际上,这两个密码是独立的。管理端用户的密码由业务逻辑处理,而数据库密码是框架连接数据库所需,两者没有直接关联。 另外,可能需要考虑项目的安全设置。例如,管理端密码应该加密存储,而数据库密码在配置文件中可能是加密的或者以明文存在,但两者加密方式和存储位置不同。如果有特殊配置,比如数据库用户权限限制,可能需要特定的密码,但这种情况较少见,且项目文档会特别说明。 可能的疑问点包括:是否有项目配置步骤中要求将两者设为相同?或者用户是否在部署过程中遇到了错误,导致误以为密码需要一致?这时候需要引导用户检查配置文件和数据库用户权限,确认两者是否独立设置。 总结来说,答案应该是否定的,即不需要相同,并解释两者的不同用途和存储位置。同时,给出检查配置的建议,帮助用户确认自己的设置是否正确。如果有必要,还可以提醒用户注意密码的安全性,如避免使用弱密码,分别管理不同密码等。</think>在《黑马苍穹外卖》项目中,管理端登录密码数据库密码是两个**独立**的配置项,不需要设置为同一个值。以下是关键点说明: --- ### 1. **管理端登录密码** - **用途**:用于后台管理系统的用户身份验证(如管理员账号登录)。 - **存储位置**:存储在业务数据库的 `employee` 表中(字段一般为 `password`)。 - **加密方式**:通常使用 MD5 或 BCrypt 加密(项目可能自定义加密逻辑)。 - **修改方式**:可通过管理端界面修改用户密码,或直接操作数据库表。 --- ### 2. **数据库连接密码** - **用途**:用于应用程序连接 MySQL 等数据库的鉴权。 - **存储位置**:在项目的配置文件中(如 `application.yml` 或 `application.properties`)。 - **加密方式**:明文或通过 Jasypt 等工具加密(需配合密钥解密)。 - **修改方式**:需修改配置文件并重启服务。 --- ### 3. **两者关系** - **完全独立**:管理端用户密码属于业务数据,而数据库密码属于基础设施配置,二者无直接关联。 - **典型配置示例**: ```yaml # application.yml 中的数据库配置 spring: datasource: url: jdbc:mysql://localhost:3306/sky_take_out?useSSL=false username: root password: 123456 # 数据库连接密码(与业务用户无关) ``` --- ### 4. **常见问题排查** - **登录失败**:若管理端无法登录,需检查 `employee` 表中密码是否加密正确。 - **数据库连接失败**:若应用启动时报数据库连接错误,需检查配置文件的用户名/密码是否与数据库实际配置一致。 --- ### 总结 无需将管理端用户密码数据库密码设置为相同值。若遇到问题,建议分别检查: 1. 业务用户表(如 `employee`)中的密码加密逻辑 2. 配置文件中数据库连接的账号密码 可根据项目实际代码和文档进一步验证配置细节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值