【发布时间】:2012-08-25 12:25:20
【问题描述】:
在安全性和身份验证以及大多数其他客户端-服务器通信方面,我还是个新手。我想做的很简单,如果可能的话,避免引入 3rd 方框架和类来完成这项工作。 (我在 Python 中使用 Google App Engine)
用户通过移动应用程序 (iOS) 登录一次服务。登录后,用户将发出许多请求,以获取消息、朋友、状态等信息。因此,每次应用程序与服务器通信时,我们不会发送该用户的电子邮件和密码进行身份验证,而是发送一个会话 ID。到目前为止,这只是我对系统的理解。
我想出了一个非常简单的方法,对我来说似乎效果很好,但是由于缺乏经验,我可能看不到很多东西。这样做会有什么问题:
在设备上,用户输入电子邮件/密码,凭据被发送到服务器并进行验证,一旦通过验证,就会生成一个随机数。这个随机数以 IntegerProperty 的形式存储在 User 模型上,名称为 session_number。
session_number 被发送到用户的设备并被保存。现在,只要用户连接到服务器进行请求,session_number 连同用户的整数 ID 号都会发送到服务器。我们得到该 userId 的 User 实体,现在我们比较 user.session_number == incoming_session_number 的值。如果他们匹配,我们很好,否则错误。
如果用户注销,我们会从数据存储中清除 session_number。
这里唯一的另一个问题是当用户从多个设备登录时如何处理?每个设备都应该存储自己的 session_number 吗?
【问题讨论】:
-
“凭据被发送到服务器并经过验证”——这是最大的部分,也是最有可能存在安全漏洞的部分。你打算如何做这件事? (通过 HTTPS 登录 Google 帐户?)除此之外,您的方案似乎还可以,尽管您可能希望每隔一段时间强制用户重新登录(以减轻任何会话劫持风险)。请注意,我也远不是安全专家 ;-)
-
通过验证我的意思是如果incoming_password == user.password,然后验证,否则错误。
-
如何确保凭据被加密?
-
@Cameron 密码作为 SHA256 哈希值存储在数据存储中,该值也是通过无线电波发送的内容。
-
因此,本质上,您的密码是以明文形式发送的,因为:如果有人偷看您的数据库,他们可以准确地看到他们需要通过网络发送的登录信息。存储散列密码,然后将其作为相同的字符串发送,首先破坏了使用散列的保护。您应该使用不同的加密,例如: 从服务器发送一个随机 nonce 字符串(可能是 32 个随机字符);让客户端将其附加到其密码的哈希中,然后对结果进行哈希处理,然后将其发回;然后服务器将 nonce 附加到存储的密码以检查...
标签: security google-app-engine session authentication