1

好吧,既然你们都不喜欢我的问题,让我重新表述一下。

用户登录到 HTML 表单。使用 JavaScript,他们的密码在本地进行哈希处理(也加盐)。服务器知道密码+盐应该是什么,用户已经注册,blahblahblah。现在用户请求一个页面。服务器向用户发送一个随机 ID。当用户加载下一页时,这个随机 ID 被附加到他们本地存储的密钥上,它被散列,然后被发送到服务器。服务器知道他们的密钥是什么和随机 ID,执行相同的哈希并进行比较。如果它们匹配,恭喜,它来自正确的计算机。如果没有,那么有人一直在嗅探您的 TCP/IP 流量。

所有这一切显然都没有SSL,否则这将是高度冗余的。

我的问题 - 我如何在客户端 PC 上存储密钥?

原帖:

你好;

我正在开发一个 PHP 内容管理系统,并提出了一个安全的登录系统。唯一的问题是它需要某种形式的客户端存储(对于一个非常小的密钥,长度为 40 个字符) - 否则用户必须在每次页面加载时输入他们的密码。

有没有办法,使用 PHP 或 JavaScript,我可以在客户端的 PC 上存储一个 40 个字符的小字符串,然后再检索它?

编辑:饼干不是一种选择。这 40 个字符的字符串不能离开客户端的计算机,并且所有设置的 cookie 都与每个 HTTP 标头一起发送。

我重复一遍 - Cookie 是不安全的,不是一个可行的选择。

让我这样修改它——客户端提交一个 HTTP 表单。使用某些脚本语言(例如 JavaScript),密码会从表单中删除,不会发送到服务器,加密并保存在客户端,我可以检索和验证(通过使用发送给用户的密钥对其进行散列)服务器)。这个验证被发送到服务器,而不是 key

4

9 回答 9

11

已经有一个基于浏览器的系统使用密钥来保护数据传输。它被称为 SSL。

于 2009-08-20T18:48:03.713 回答
5

您可以使用几种不同的技巧来保持客户端的状态,您可以保持顶级框架并在那里存储一个 javascript 变量。

您可以使用 Flash 本地“SharedObject”,

Silverlights 的独立存储

或 Google Gears 中的等价物。

但..

不要遵循这种思路。您需要 SSL。您不会构建安全的东西,您将构建的东西会让您或使用您的应用程序的人感到震惊。

于 2009-08-20T19:31:47.273 回答
4

首先,我将回答“我可以在不使用 cookie 的情况下存储客户端数据吗”的问题:

  • 您可以使用 Flash SharedObject,但当然需要 Flash,并且用户必须单击确认框才能允许它。
  • HTML5 具有客户端数据库,因此为您提供了另一种新兴选择。
  • 在客户端使用 Google Gears 并使用其本地数据库 API

但是-出于您的目的,您可以设计一个不传输密码但发送密码哈希的登录表单。您的 PHP 脚本将发送一个包含秘密盐值的表单,然后您有一些 javascript 挂钩到提交事件并用盐化哈希替换输入的密码。

于 2009-08-20T18:44:56.917 回答
3

我不是 PHP 开发人员,但我建议您搜索预先存在的身份验证系统。它们通常会比您编写的内容更安全(因为这将是它们的主要目的)。它还允许您查看代码并查看他们是如何做到的并找出原因。

编辑:您几乎总是希望在服务器上处理身份验证。以 cookie 或 url 参数的形式将会话信息传输给用户是可以接受的,但实际处理应该在服务器上完成。否则,您将面临重大风险。

于 2009-08-20T18:42:41.320 回答
2

如果您想在浏览器访问之间保存它,请使用 cookie。它将存储在客户端的机器上。

如果您想将会话保存更短的时间,请使用会话。它将存储在网络服务器上。

于 2009-08-20T18:42:48.810 回答
1

如果你想创建一些从未在互联网上传播过的东西,你基本上必须用 JavaScript 来完成。

首先,创建一段代码,启动类似于 Google Gears 的东西。使用 Google Gears 中的数据库来存储密钥。

接下来,在其余页面上,有一段 javascript 检查 Google Gear 数据库中的密钥。如果密钥无效,请删除密钥,重定向用户,让他们重新登录。

于 2009-08-20T18:43:41.630 回答
0

我看到你的方法有问题。可以嗅探初始 JavaScript 的首次加载,因此盐算法不受黑客攻击。那么ID也是“公开的”。即似乎你有下一个模式(如果我错了,请纠正我):

password + SHA1 => hashed password
hashed password + (ID from server) + (salt from server) => mega hashed password

我真的很难理解为什么“超级散列密码”比散列更安全。

于 2009-08-20T19:14:26.700 回答
0

Cookie 是执行此操作的方法,但您不会在 cookie 中存储任何密码,这(几乎)是一个命令;-)。

您可以使用 session 来存储服务器端页面加载之间的信息。 http://fr.php.net/manual/en/book.session.php

于 2009-08-20T18:41:18.267 回答
0

除了 Bryan 所说的,如果您可以使用 HTML 5 规范,那么您可以利用本地存储。

http://ajaxian.com/archives/webkit-does-html5-client-side-database-storage

于 2009-08-20T18:51:37.543 回答