如今越来越多的网站和应用为了保障用户账户安全,纷纷采用扫码登录和验证码登录等多种认证方式。这种无密码登录模式大幅提升了账户防护等级,避免了传统密码泄露带来的风险。
最近有位朋友在面试时遇到了一道很有意思的题目,相信大多数人都没深入思考过这个问题。
面试官提出的问题是:"为什么大多数平台在用户忘记密码时,都要求重新设置新密码,而不是直接把原密码告诉用户?"
这确实是个值得玩味的问题。几乎所有的网站都设有"找回密码"功能,但当我们点击忘记密码,经过一系列身份验证后,系统总是引导我们重置密码,而不是直接显示原始密码。
今天我们就来深入探讨这个看似简单却蕴含深意的问题。
防止信息泄露
Termly在2024年11月1日更新的《98个最大的数据泄露、黑客攻击和信息曝光事件》报告中,列举了众多知名企业的安全事件,包括Twitter等社交平台。
这意味着存储在服务器上的用户数据并非绝对安全。一旦发生数据泄露,可能会对用户造成哪些影响呢?
对大多数人来说,最直接的体验就是接连接到诈骗电话,对方甚至能准确说出你的个人信息。这些隐私信息究竟是如何流入他人手中的?
可能有人会认为是"有人贩卖了我的个人信息",但实际上,正规的互联网企业都不会主动做这种事情。
真实情况往往是数据库遭到泄露,导致你的全部个人资料都被不法分子获取。
同理,既然他们能获取你的私人信息,那么你的账户名和密码同样存在被盗取的风险。
对大多数用户而言,为了免去记忆多个密码的麻烦,常常会使用同一套密码组合!也就是说,你在不同平台的账户可能都使用着相同的密码。一旦某个平台的密码泄露,就可能导致你多个账户受到影响,甚至连银行账户都可能面临风险。
因此,对于各类互联网平台(特别是大型网站)来说,保护用户数据安全是至关重要的责任。那么他们通常会采取哪些安全措施呢?
常规的处理方式就是加密存储,而且这种加密往往会在多个环节重复进行。常见的加密算法包括:SHA256、加盐哈希、MD5、RSA等多种加密方式。
表面看来这样做似乎很安全,但这里存在一个问题:开发人员知道如何解密这些数据。或者有些用户会认为数据库中仍然保存着正确的密码?一旦发生信息泄露,不就意味着密码也会同时泄露吗?
没错,正是为了解决这个问题,所以系统本身也不会存储用户的明文密码。
系统无法获知你的原始密码
对于互联网平台(以及其他应用)而言,它们不应该存储你的原始密码。而是通过一系列加密运算来保存处理后的密码散列值。这个加密过程通常在前端向服务器传输数据时就已经完成,而且是不可逆的加密操作,例如:MD5+盐值哈希。
我们来看一个简单的例子:
假设某用户的密码是123456,经过MD5加密后得到的散列值是:E10ADC3949BA59ABBE56E057F20F883E
理论上MD5是不可逆的,所以从原理上来说这个加密后的散列值是无法被解析的。但MD5存在一个比较严重的问题:相同的字符串加密后会得到相同的结果。
这就意味着:E10ADC3949BA59ABBE56E057F20F883E永远对应着123456
因此,如果存在一个庞大的MD5密码库,理论上就可以破解所有经过MD5加密的字符串。就像下图所示:
图片
为此,在基础的MD5加密之上,许多平台还会额外进行加盐处理。所谓加盐指的就是:在原始密码的基础上添加随机字符串,然后再进行MD5加密。
举个例子:
原始密码为123456,在这个密码基础上添加固定字符串"LGD_Sunday!"后得到"LGD_Sunday!123456",然后用该字符串进行MD5加密,结果是:E1FC8CB7B54BED0FDC8711530236BA4D。此时尝试解密会发现无法还原原始密码。
图片
现在大家应该能够理解,为什么很多网站在设置密码时都要求包含大小写字母+符号+数字了吧。本质上就是为了防止密码被轻易破解。
而服务端拿到的是"E1FC8CB7B54BED0FDC8511530236BA4D"这样的加密结果。然后服务端会再次对密码进行加密处理,从而得到一个被多次加密的数据最终保存到服务器端。
所以说:系统无法告知你原始密码的具体内容,因为它也不知道你的密码是什么。
目前大多数网站和应用程序为了确保用户账户安全,普遍采用扫码登录、验证码登录等认证方式。这种无密码登录机制,能够在更大程度上保障你的账户安全。
