【问题标题】:Is data submitted in a form secure?以表格形式提交的数据是否安全?
【发布时间】:2018-04-14 22:29:25
【问题描述】:

我正在创建一个对用户数据(例如用户名、电子邮件、电话号码...)进行编码的网站,以确保他们的数据安全。 为了防止数据公开,我在将其存储到数据库之前使用 SHA1 对其进行编码。我正在使用 PHP 处理请求。

提交表单并发送数据时,数据是否会泄露或截获?例如由 NSA 或攻击者。

如果是这样,我正在考虑在提交表单之前使用 JavaScript 对数据进行编码。这行得通吗?

【问题讨论】:

  • 编码是什么意思?密码的 SHA1 错误,请使用 bcrypt,如果您不希望中途拦截您的数据(中间人攻击),则必须使用 HTTPS
  • 存储经过哈希处理的用户名或电子邮件有什么意义?
  • 嗨,我不是安全专家,但我认为 HTTPS 协议是解决这类问题的方法,并且作为注释,如果你 sha1 一个字符串,你通常可以'不从哈希中获取原始字符串,因此它仅用于密码,因此即使是网站管理员或从您那里窃取数据库的人也无法识别它们(理论上他不能)。
  • 不要混淆编码、加密和散列。它们都是非常不同的东西。出于安全目的,sha1总是是错误的;几年前它就坏了。没有理由不使用 TLS,这是您能做的最好的事情。从letsencrypt.org 获取免费证书。

标签: php forms security http-post anonymous


【解决方案1】:

我知道我不应该回答这个问题,因为它离题了,但这里有一些事情必须澄清:

“编码”数据

在你的第一段中,你说我正在对输入的数据进行编码,我不知道你的意思。

如果您的意思是加密,如果您使用电子邮件/用户名进行身份验证,我不确定您如何加密它们。

但一般来说,加密数据是一件好事,只要您使用具有安全存储的强密钥的良好密码,请查看Where to store a server-side encryption key?

您还说在将 sha1 存储到数据库之前使用它。这也不清楚,你是用sha1散列所有数据吗?如果是这样的话。如何在需要时“取消哈希”数据。

我想您正在对密码进行哈希处理,但 sha1 和 md5(两种常见算法)不适用于密码(或者正如 @Peter 所说:不适合任何与安全相关的事情)。

要散列密码,您需要使用正确的算法,例如 bcrypt、scrypt 或 argon。 在 PHP 中,散列密码的最佳方法是使用本机内置函数。 password_hash() 用于散列,password_verify() 用于验证散列。 这些函数在 PHP 5.5 或更新版本中可用,如果您使用旧版本 - 考虑更新 - 您可以使用 ircmaxell 的 compatibility library

数据“泄露”

在第 2 段中,您谈到了以表格形式提交的数据被“泄露”,我想您的意思是拦截了又名 Man-In-The-Middle 攻击-简称 MITM-。

要保护数据免受 MITM 攻击,您需要使用 HTTPS 而不是不安全的 HTTP。 HTTPS 加密在您的服务器和客户端(浏览器/用户)之间发送的数据,这将防止任何人拦截数据。 通常要获得 HTTPS,您必须付费,但现在有一个免费的证书颁发机构 -CA 简称为Let's Encrypt,提供免费证书。

使用 JavaScript 加密数据

您谈到了在提交表单之前使用 JavaScript 加密数据。 这行不通,因为当客户端连接到您的普通 HTTP 网站时,HTML/JavaScript 是纯文本的并且可以更改,攻击者可以简单地拦截您的 JavaScript 代码(将加密数据的代码)和把它改成他想要的任何东西。

您应该考虑的唯一解决方案是为您的网站获取 SSL 证书。

国家安全局的事情

我假设您说的是机构进行的监视,这里有两件事:

  • MITM 攻击我已经在上面介绍过,使用 HTTPS。

  • 访问服务器上的数据。如果 NSA 对您的数据感兴趣,并且您的服务器位于他们有管辖权的地方,他们可以简单地访问您服务器中未加密的数据。

您使用了错误的术语

我发现你用错了术语,编码不是你想的那样。

编码只是将数据转换为特定格式(例如 JSON)。

加密是当您获取数据并使用算法和密钥将其转换为不可读的格式时,加密可保护数据免受未经授权的访问,加密的数据可以解密为原始状态。

散列是使用单向函数从给定数据生成一个值(称为散列)。 这意味着,给定一个哈希值,理论上您无法取回原始值。

这只是对您问题的一般回答,而不是最终的安全指南(我不是安全专家!)


参考文献

【讨论】:

  • 非常感谢您提供的信息。我不知道 sha1 编码对密码不利。关于您对 Javascript 加密的看法:我认为仅查看 Javascript 代码并看到表单数据已编码,我认为不会泄露表单数据。他们应该如何访问用户输入的数据?
  • 这里要特别清楚:sha1 不适合与安全相关的任何东西,而不仅仅是密码。它充其量对完整性检查很有用,就像 md5 一样。
  • @user1743312 _我不认为表单数据..._他们可以,再次阅读JS部分我更新了它。
  • @user1743312, sha1 是 not collision resistant 并且速度很快。所有快速哈希都不适合密码,因为攻击者可以有效地暴力破解它们。只需在 PHP 中使用 password_hash 并继续。请仔细阅读编码、加密和散列的实际含义。
  • @user1743312 我给了你一些你应该阅读的参考资料,请花时间阅读它们,“NSA”可以修改JS代码,因为它在那里,就在那里!纯文本。阅读MITM
【解决方案2】:

您的问题“以表单提交的数据安全吗?”的简单答案是“是”和“否”。这取决于您提交数据的方式。如果您使用的是 HTTP 等明文协议,那么它是不安全的。因为数据以明文形式传输,攻击者可以嗅探和读取数据。但是,如果您通过 HTTPS 提交数据,那么是的,您的数据是安全提交的。

现在是数据存储部分。建议在将密码存储到数据库之前使用强哈希算法和盐对密码进行哈希处理。您不需要散列/编码数据,例如电子邮件 ID 或用户名。这可以存储为纯文本。

因此,简而言之,如果您通过 SSL 提交数据并在存储之前对密码进行哈希处理,那么您就是在传输过程中对数据进行加密并将其安全地存储在数据库中。这是行业标准,包括顶级安全公司在内的许多公司都遵循这一标准。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-03
    • 2017-12-16
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    相关资源
    最近更新 更多