现代网站如何检查您的密码而不实际存储它 (modern websites)

有人告诉我,你不应该将用户密码存储在数据库中,但是如果我不能保存他们的密码,我怎么能对用户进行身份验证?

有人告诉我,你不应该将用户密码存储在数据库中,但是如果我不能保存他们的密码,我怎么能对用户进行身份验证?

最近的新闻中有几篇报道说,像 LinkedIn 这样的备受瞩目的网站已经被泄露,我不认为这样一个备受瞩目的网站会存储纯文本密码,所以会假设它们是加密的。

7

免责声明:我最初发布了this on Quora,但觉得答案更适合 Stack Overflow。

用于存储和检查用户密码而不实际保留密码的方法是将用户输入与存储的哈希进行比较。

什么是哈希?

哈希是通过一种算法传递可变长度(小密码,大密码,二进制文件等)的数据的过程,该算法将其作为一组固定长度的哈希值返回。哈希只能以一种方式工作。由几个 Mb 组成的 *.img 文件可以与密码完全相同地进行哈希处理。(实际上,通常的做法是在大文件上使用哈希来检查它们的完整性,而不是在大文件上使用哈希来下载。

使用哈希进行身份验证是如何工作的?

当用户注册时,他提供了一个密码,例如pass123,然后将其哈希(通过任何可用的哈希算法:sha1,sha256 等,在这种情况下为 md5)值32250170a0dca92d53ec9624f336ca24,该值存储在数据库中。每次尝试登录时,系统都会实时对您的密码进行哈希处理,并将其与存储的哈希值进行比较,如果匹配,则可以尝试

如果两个哈希值相同怎么办?用户可以使用不同的通行证登录吗?

他可以!这称为碰撞。假设在虚构的哈希算法中,值pass123将产生哈希ec9624,而值pass321将产生完全相同的哈希,该哈希算法将被。当发现冲突时,常见的算法 md5 和 sha1(使用的 LinkedIn)都被了。被并不一定意味着它不安全。

如何利用碰撞?

如果您可以生成哈希,则与用户密码生成的哈希相同,您可以将该站点标识为用户。

彩虹表攻击。

破解者很快就明白,一旦他们捕获了哈希密码表,就不可能逐个利用密码,因此他们设计了一个新的攻击向量。他们将生成存在的每个密码(aaa,aab,aac,aad 等),并将所有哈希存储在数据库中。然后,他们只需要使用所有按顺序生成的哈希(亚秒查询)在数据库中搜索被盗的哈希,即可获得。

拯救盐(以及 LinkedIn 失败的地方!)

安全性是由破解者破解密码所需的时间以及更改密码的频率来定义的。使用彩虹表,安全性下降得非常快,因此业界提出了盐。如果每个密码都有独特的扭曲怎么办?那是盐!对于每个注册的用户,您都会生成一个随机字符串,例如 3 个字符(业界建议使用 16 个字符-https://stackoverflow.com/a/18419..。)。然后将用户的密码与随机字符串连接起来。

password - salt - sha1 hash  
qwerty   - 123  - 5cec175b165e5e62c9e13ce848ef6feac81bff  
qwerty   - 321  - b8b92ab870c50ce5fc59571dc0c77f9a4a90323c  
qazwsx   - abc  - c6aec64efe2a25c6bc35aeea2aafb2e86ac96a0c  
qazwsx   - cba  - 31e42c24f71dc5a453b2635e6ec57eadf03090fd  

正如你所看到的,完全相同的密码,给定不同的盐值,产生完全不同的哈希值。这就是盐的目的,也是 LinkedIn 失败的原因。请注意,在桌子上,你只会存储哈希和盐!永远不要密码!

拿到 LinkedIn 哈希值的人做的第一件事就是对哈希值进行排序,看看是否有匹配项(这是因为多个用户拥有相同的密码-真可惜!)这些用户是第一个删除的用户。如果通行证表被加盐了……这些都不会发生,他们将需要大量的时间(和计算机资源)来破解每个密码。这将使 LinkedIn 有足够的时间来执行新的策略

希望答案的技术方面提供了有关身份验证如何工作(或应该工作)的见解。

1

真的很喜欢,当有人问这个问题时,因为这个人想做得更好。只知道几个要点,即使是知名网站也可以避免很多麻烦。

最近我写了一个关于Hashing passwords的教程,它使用了一种希望简单易懂的语言。它允许使用 SQL 注入,解释了盐和胡椒的用法,并指出需要缓慢的密钥派生函数。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(620)
将Paypal付款链接到asp.net网站
上一篇
连接到 TM-U220时出错
下一篇

相关推荐

  • python可以应用在哪些方面:Python在数据分析、机器学习、Web开发等方面的应用

    示例示例Python可以应用于多种领域,主要如下:Web开发:Python可以用于搭建网站,它提供了许多Web开发框架,如Django、Flask等,可以帮助开发者快速搭建网站。…

    2023-07-04 08:16:51
    0 21 59
  • django web开发构建功能强大的Web应用

    Django 是一个开放源代码的 Web 应用框架,由 Python 编写而成。它采用了 MVC(模型-视图-控制器)的软件设计模式,即模型(Model)负责业务逻辑和数据处理,视图(View)负责显示逻辑,控制器(Controller)处理用户交互。…

    2023-04-23 13:21:35
    0 98 49
  • webshell查杀基于Webshell的网站安全检测与清除

    webshell查杀是一种用于检测网站中是否存在webshell的安全技术,它可以帮助网站管理者及时发现和清除网站中的恶意脚本。…

    2023-12-26 03:09:14
    0 56 23
  • windows http服务器:使用 Windows 的 HTTP 服务器提高 Web 应用程序性能

    Windows HTTP 服务器是一种轻量级的Web服务器,它可以提供HTTP服务,以便客户端可以通过HTTP协议访问Web应用程序。它使用HTTP协议作为底层传输协议,并使用Internet Information Services(IIS)作为服务器软件。…

    2023-09-29 08:03:31
    0 80 86
  • javaweb开发基本三层架构:基于 JavaWeb 的三层架构开发实践

    javaweb开发基本三层架构是指,在软件开发中,将应用程序的功能分为三层:表示层、业务逻辑层和数据访问层。其中,表示层负责处理用户界面和用户交互,业务逻辑层负责处理业务逻辑,数据访问层负责处理数据存取。…

    2023-03-16 03:07:14
    0 28 90
  • javaweb面试:如何在Java Web开发中实现高性能

    示例示例JavaWeb面试是指对应聘者进行JavaWeb开发技术的考核,以确定应聘者是否具备开发JavaWeb应用程序的能力。JavaWeb面试题通常会涉及以下内容:…

    2023-01-04 05:29:47
    0 91 84
  • java和javascript:如何使用Java和JavaScript实现Web开发

    示例示例Java和都是编程语言,但它们之间有很大的不同。Java是一种面向对象的、编译型的、跨平台的编程语言,它的代码在运行前需要编译成字节码,然后才能在计算机上运行。Java程序可以在任何支持Java虚拟机的计算机上运行,而不必重新编译。下面是一个简单的Java程序:…

    2023-01-13 09:45:13
    0 92 84
  • python方向:如何使用Python进行Web开发

    Python 是一种面向对象的、解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。…

    2023-06-15 04:25:06
    0 75 22

发表评论

登录 后才能评论

评论列表(35条)