前端或后端的密码散列?

信息安全 tls 密码 http 爪哇
2021-08-09 14:09:31

我有一个带有 Spring Boot 的 Java 服务器和一个 AngularJS 中的 JS 前端。

我的老师告诉我使用 HTTPS 作为密码,因为我不能足够安全地散列它们,没有人可以破解它们。

使用 HTTPS,如果我做对了,我就不必对它进行额外的哈希处理。我的消息来源:我只是通过 https 发送用户名和密码。这个可以吗?

所以现在我的问题是:我当然将密码存储在数据库中。我应该在哪里散列它们?前端还是后端?

  • 如果我在前端散列它,我不必在后端做其他事情;但如果 HTTPS 证书过期,我就不安全了。
  • 如果我在后端做,我不必在前端做其他事情;但如果 HTTPS 证书过期,我就不安全了。

我会使用 Scrypt,它是为密码散列而设计的。

4个回答

@John已经很好地描述了通过网络传递密码(使用 HTTPS)。

要回答您的问题:

我应该在哪里散列它们?前端还是后端?

后端如果你只在前端散列它们,你很容易受到散列攻击。

您在数据库中散列密码的原因是为了防止已经破坏您的数据库的攻击者使用这些密码。

如果您在后端散列密码,攻击者必须首先破解它们才能在您的网站上使用它们。但是如果你在前端散列它们,攻击者不需要这样做,他们可以传递存储在数据库中的散列。

您混淆了两件事:传输安全性和数据库安全性。使用 TLS 的 HTTPS 仅保护从客户端到服务器的数据传输。这意味着窃听者不知道客户端和服务器正在相互发送什么(简化)。密码的存储是一个完全不同的话题。您要确保即使攻击者可以访问您的数据库,他也无法访问明文密码。

无论您如何存储密码,都应始终使用 TLS。否则,窃听者可以记录客户端发送给服务器以进行身份​​验证的内容。那么无论您是在客户端还是服务器端进行密码哈希处理都无关紧要。攻击者可以简单地记录通过网络传输的内容并重放通信以获取访问权限,从而冒充客户端。

(注意你要做密码哈希,而不是加密。哈希是单向的,加密不是)

散列应该在后端完成。后端由您控制,因此您可以强制执行散列操作。此外,您可以进行客户端散列。您不应该单独使用客户端散列,因为该过程将在 JavaScript 中完成,用户可以阻止或操纵该过程。这似乎不是一个合理的威胁,但你永远不应该相信任何用户提供的数据。因此,您不应该假设客户端正在正确地进行散列。这意味着您绝对必须在后端执行此操作。

HTTPS 仅为传输层提供安全性。它与存储所需的安全机制无关。

你不应该加密密码。你应该对它们进行哈希处理,这样你以后就不能解密它们(也不能被攻击者解密)。

并且哈希步骤总是在后端完成,因为在客户端执行它会允许访问您的哈希的攻击者登录每个帐户的方法。

HTTPS(基于 TLS/SSL 的 HTTP)为传输中的数据/动态数据提供安全性,它不为静态数据(数据库、硬盘驱动器上的文件)提供加密-> 使用 AES、3DES、BlowFish 等加密。

您可以对数据库进行加密,但不能对整个数据库进行加密,因为这会占用您的资源(加密文件大于未加密文件)。只需加密特定字段,即客户 PII -> 信用卡信息。

加密用户密码不是最佳实践,只需 HASH 和 SALT 即可。

当您的 HTTPS 证书到期时,攻击者可以以纯文本形式嗅探密码,只需在您的代码上提供安全层即可。

当用户提供密码时,您的代码应该有一个存储过程 (SQL) 来匹配数据库上用户密码的 HASHED+SALT 值。如果 HASH+SALT 值不匹配,显然是密码错误。

注意:哈希提供完整性。

SALT 函数将降低攻击者进行彩虹表攻击的风险,因为攻击者不知道 SALT 值。

关键:哈希+盐

https://en.wikipedia.org/wiki/Salt_(密码学)