·设为首页收藏本站📧邮箱修改🎁免费下载专区📒收藏夹👽聊天室📱AI智能体
DZ插件网 门户 网站安全 查看内容

面试官:为什么忘记密码要重置而不是告诉你原密码?

2025-2-28 15:21| 发布者: TyCoding| 查看: 32| 评论: 0

摘要: mall学习教程官网:macrozheng.com这是一个挺有意思的面试题,挺简单的,不知道大家平时在重置密码的时候有没有想过这个问题。回答这个问题其实就一句话:因为服务端也不知道你的原密码是什么。如果知道的话,那就是 ...

面试官:为什么忘记密码要重置而不是告诉你原密码?3868 作者: 来源: 发布时间:2025-2-28 15:21

mall学习教程官网:macrozheng.com

这是一个挺有意思的面试题,挺简单的,不知道大家平时在重置密码的时候有没有想过这个问题。回答这个问题其实就一句话:因为服务端也不知道你的原密码是什么。如果知道的话,那就是严重的安全风险问题了。

面试官:为什么忘记密码要重置而不是告诉你原密码?819 作者: 来源: 发布时间:2025-2-28 15:21
重置帐号密码

我们这里来简单分析一下。

做过开发的应该都知道,服务端在保存密码到数据库的时候,绝对不能直接明文存储。如果明文存储的话,风险太大,且不说数据库的数据有被盗的风险,如果被服务端的相关人员特别是有数据库权限的恶意利用,那将是不可预估的风险。

一般情况下,我们都是通过哈希算法来加密密码并保存(严格上来说,哈希算法不属于加密算法,只是可以用到某些加密场景中)。

哈希算法也叫散列函数或摘要算法,它的作用是对任意长度的数据生成一个固定长度的唯一标识,也叫哈希值、散列值或消息摘要(后文统称为哈希值)。

面试官:为什么忘记密码要重置而不是告诉你原密码?545 作者: 来源: 发布时间:2025-2-28 15:21
哈希算法效果演示

哈希算法可以简单分为两类:
  1. 加密哈希算法:安全性较高的哈希算法,它可以提供一定的数据完整性保护和数据防篡改能力,能够抵御一定的攻击手段,安全性相对较高,但性能较差,适用于对安全性要求较高的场景。例如 SHA2、SHA3、SM3、RIPEMD-160、BLAKE2、SipHash 等等。
  2. 非加密哈希算法:安全性相对较低的哈希算法,易受到暴力破解、冲突攻击等攻击手段的影响,但性能较高,适用于对安全性没有要求的业务场景。例如 CRC32、MurMurHash3、SipHash 等等。

这或许是一个对你有用的开源项目,mall项目是一套基于 SpringBoot3 + JDK 17 + Vue 实现的电商系统(Github标星60K),采用Docker容器化部署,后端支持多模块和微服务架构。包括前台商城项目和后台管理系统,能支持完整的订单流程!涵盖商品、订单、购物车、权限、优惠券、会员、支付等功能!
  • Boot项目:https://github.com/macrozheng/mall
  • Cloud项目:https://github.com/macrozheng/mall-swarm
  • 视频教程:https://www.macrozheng.com/video/

项目演示:
面试官:为什么忘记密码要重置而不是告诉你原密码?938 作者: 来源: 发布时间:2025-2-28 15:21


除了这两种之外,还有一些特殊的哈希算法,例如安全性更高的慢哈希算法。

目前,比较常用的是通过 MD5 + Salt 的方式来加密密码。盐(Salt)在密码学中,是指通过在密码任意固定位置插入特定的字符串,让哈希后的结果和使用原始密码的哈希结果不相符,这种过程称之为“加盐”。

不过,这种方式已经不被推荐,因为 MD5 算法的安全性较低,抗碰撞性差。详细介绍可以阅读我写的这篇文章:简历别再写 MD5 加密密码了! 。你可以使用安全性较高的加密哈希算法+ Salt(盐)(例如 SHA2、SHA3、SM3,更高的安全性更强的抗碰撞性)或者直接使用慢哈希(例如 Bcrypt,更推荐这种方式)。

假如我们这里使用  SHA-256 + Salt 这种方式。

这里写了一个简单的示例代码:
String password = "123456";
String salt = "1abd1c";
// 创建SHA-256摘要对象
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update((password + salt).getBytes());
// 计算哈希值
byte[] result = messageDigest.digest();
// 将哈希值转换为十六进制字符串
String hexString = new HexBinaryAdapter().marshal(result);
System.out.println("Original String: " + password);
System.out.println("SHA-256 Hash: " + hexString.toLowerCase());

输出:
Original String: 123456
SHA-256 Hash: 424026bb6e21ba5cda976caed81d15a3be7b1b2accabb79878758289df98cbec

在这个例子中,服务端保存的就是密码“123456”加盐哈希之后的数据,也就是“424026bb6e21ba5cda976caed81d15a3be7b1b2accabb79878758289df98cbec” 。

面试官:为什么忘记密码要重置而不是告诉你原密码?2733 作者: 来源: 发布时间:2025-2-28 15:21

当你输入密码登录之后,服务端会先把你的密码对应的盐取出,然后再去执行一遍获取哈希值的过程。如果最终计算出来的哈希值和保存在数据库中的哈希值一直,那就说明密码是正确的。否则的话,密码就不是正确的。

哈希算法的是不可逆的,你无法通过哈希之后的值再得到原值,这样的话,服务端也不知道你的原密码到底是什么,自然没办法告诉你原密码是什么。


Github上标星60K的电商实战项目mall,全套 视频教程(2023最新版) 已更新完毕!全套教程约40小时,共113期,通过这套教程你可以拥有一个涵盖主流Java技术栈的完整项目经验,同时提高自己独立开发一个项目的能力,下面是项目的整体架构图,感兴趣的小伙伴可以点击链接 mall视频教程 加入学习。

面试官:为什么忘记密码要重置而不是告诉你原密码?2694 作者: 来源: 发布时间:2025-2-28 15:21

整套 视频教程 的内容还是非常完善的,涵盖了mall项目最佳学习路线、整体框架搭建、业务与技术实现全方位解析、线上Docker环境部署、微服务项目学习等内容,你也可以点击链接 mall视频教程 了解更多内容。

推荐阅读

  • 全面升级!一套基于Spring Boot 3+JDK17的实战项目!
  • 69K Star!这是我见过最强的开源电商系统 !!
  • Github标星60K!一套完整的项目实战教程来了,主流Java技术一网打尽!
  • 看了我项目中购物车、订单、支付一整套设计,同事也开始悄悄模仿了...
  • 支付系统就该这么设计,稳的一批!
  • 权限系统就该这么设计,稳的一批!





上一篇:10 款 IDEA 宝贝插件,yyds!
下一篇:走进企业看安全 知道创宇站 圆满结束!

鲜花

握手

雷人

路过

鸡蛋

评论

您需要登录后才可以发表言论 登录立即注册
关闭

站长推荐上一条 /1 下一条

最新热评 加载中...
AI智能体
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:216.73.216.212,GMT+8, 2025-6-16 10:13 , Processed in 0.131463 second(s), 42 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2025 Discuz! Team.

关灯
扫一扫添加微信客服
QQ客服返回顶部
返回顶部