面试揭秘:忘记密码时为何要重置,而非直接告知?

安全 应用安全
对于网站(或其他应用程序)来说,它们不应该存储您的原始密码。相反,它们通过一系列操作保存您的加密代码。而且这种加密在从前端传输到服务器时已经执行,而且它是不可逆的加密操作,例如:MD5 + 加盐。

最近,一个朋友在面试中遇到了一个非常有趣的问题。我相信大多数朋友可能没有遇到过。

面试官问:“为什么很多网站在忘记密码时要求重置密码,而不是直接告诉用户原始密码?” (⊙ˍ⊙)?

这是个很有趣的问题,对吧?许多网站都有“忘记密码?”的功能,但为什么当我们点击“忘记密码”并经过一系列验证后,网站会让我们重置密码,而不是直接告诉我们原始密码呢?

今天,我们就来谈谈这个问题。

防止信息泄露防止信息泄露

对大多数人来说,为了防止忘记过多密码,很多时候大家都会使用统一的密码!也就是说,您的多个账户可能都有相同的密码。因此,一旦密码泄露,可能会影响到您的多个账户,甚至是银行卡账户。

因此,对于网站(尤其是一些大型网站)来说,保护用户数据安全是极其重要的事情。

所以,您在网站上保存的数据可能并不是那么安全。

对大多数人来说,最相关的经验(网上见过)应该是诈骗电话。他们甚至可以非常清楚地告诉您所有个人信息。那么,这些信息从哪里来呢?

主要是由于数据泄露,所有您的个人信息都被他人知道。

那么,一般网站如何防止数据泄露呢?

通常的方法是加密。而且这种加密可能在不同阶段进行多次。例如,常见的有:SHA256、加盐、MD5、RSA等。

这看起来非常安全,但仍然存在一个问题。开发者知道如何解密它们。

或者有些朋友会认为,正确的密码仍然存在于数据库中?一旦发生信息泄露,不是仍然存在密码泄露的问题吗?

是的,因此为了解决这个问题,实际上,网站本身并不知道您的密码是什么。

网站本身并不知道您的密码是什么

对于网站(或其他应用程序)来说,它们不应该存储您的原始密码。相反,它们通过一系列操作保存您的加密代码。而且这种加密在从前端传输到服务器时已经执行,而且它是不可逆的加密操作,例如:MD5 + 加盐。

一般来说,我们通过哈希算法对密码进行加密和保存。

图片图片

哈希算法,也称为哈希函数或摘要算法,用于生成任意长度数据的固定长度唯一标识符,也称为哈希值或消息摘要(后文简称哈希值)。

目前,较常用的方法是通过MD5 + Salt加密密码。在密码学中,加盐指的是在密码的任意固定位置插入特定字符串,以使哈希后的结果与使用原始密码的哈希结果不匹配。这个过程称为“加盐”。

然而,这种方法现在不再推荐,因为MD5算法安全性低,抗碰撞能力差。您可以使用更安全的加密哈希算法 + Salt(如SHA2、SHA3、SM3,具有更高的安全性和更强的抗碰撞能力),或者直接使用慢哈希(如Bcrypt)。

假设我们在这里使用SHA-256 + Salt的方法。

以下是一个简单的示例代码:

publicclassHashPasswordExample{
publicstaticvoidmain(String[] args){
// 要哈希的密码
String password ="123456";
// 哈希的盐
String salt ="salt-test";
try{
// 创建SHA-256摘要对象
MessageDigest messageDigest =MessageDigest.getInstance("SHA-256");
// 更新摘要与组合的密码和盐
            messageDigest.update((password + salt).getBytes());
// 计算哈希值
byte[] result = messageDigest.digest();
// 将哈希值转换为十六进制字符串
HexBinaryAdapter hexBinaryAdapter =newHexBinaryAdapter();
String hexString = hexBinaryAdapter.marshal(result);
// 打印原始密码
System.out.println("原始字符串: "+ password);
// 打印SHA-256哈希值(小写)
System.out.println("SHA-256哈希: "+ hexString.toLowerCase());
}catch(Exception e){
            e.printStackTrace();
}
}
}

输出:

原始字符串: 123456
SHA-256哈希: 3d5ecd90301b307c267f1c09e8a4b2433c2258fcb7441df91a32e245ea86bf96

在这个示例中,服务器保存的是对密码“123456”进行加盐和哈希后的数据,即:“3d5ecd90301b307c267f1c09e8a4b2433c2258fcb7441df91a32e245ea86bf96”。

图片图片

当您输入密码进行登录时,服务器会首先取出与您的密码对应的盐,然后再进行一次获取哈希值的过程。如果最后计算出的哈希值与数据库中保存的哈希值相同,则表示密码正确。否则,密码错误。

哈希算法是不可逆的。您无法从哈希值中获得原始值。通过这种方式,服务器并不知道您的原始密码,自然也无法告诉您原始密码是什么。

为什么许多网站要求更改密码时不能与原密码相同?

然后有些朋友会再次产生疑问。为什么许多网站要求更改的密码不能与原密码相同?这是如何实现的?

这个过程实际上与验证密码的正确性是相同的。只需计算哈希值并进行比较即可!

结论

通过以上分析,我们可以清楚地看到,网站要求用户在忘记密码时重置而非直接告知原始密码的做法,主要是出于对用户信息安全的深刻考量。现代网站采用的加密措施,确保了即使数据泄露,黑客也难以获取用户的真实密码。此外,密码重置的流程不仅增加了用户的安全性,也维护了整个系统的安全性。网站不存储原始密码,而是以不可逆的加密形式保存,这样一来,即使系统遭到攻击,用户的敏感信息依然得以保护。最终,重置密码的机制不仅保护了用户的个人隐私,也提高了对网络安全的信任。面对日益复杂的网络环境,我们每个用户都应增强自身的安全意识,定期更新密码,并了解如何合理使用各种网络安全工具,以确保个人信息的安全和隐私。

责任编辑:武晓燕 来源: 路条编程
相关推荐

2024-07-29 00:00:00

原密码技术安全

2024-06-24 08:39:45

2024-04-15 10:16:38

2024-11-26 08:36:56

SpringJar机制

2021-12-06 06:19:52

Windows Server管理员密码

2011-10-09 15:02:58

蓝牙4.0NFC苹果

2013-12-26 13:35:39

2019-09-09 10:25:54

MySQLMariaDB roo密码

2024-11-25 18:53:55

Linux

2013-01-31 18:52:58

CiscoACEF5

2012-11-21 10:10:06

OpenStack网络虚拟化

2022-05-10 16:37:25

零信任网络安全

2013-06-25 09:29:46

OpenStackAmazon S3云存储

2010-05-26 17:21:14

MySQL root密

2010-06-10 15:44:53

2010-06-13 13:10:09

MySQLROOT密码

2010-06-04 16:03:37

MySQL root密

2015-05-26 08:46:58

密码LaZagne Pro密码检索

2024-07-31 16:21:08

2020-12-09 08:04:27

Centos8root密码
点赞
收藏

51CTO技术栈公众号