- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当涉及到安全性和身份验证以及大多数其他客户端-服务器通信内容时,我有点新手。我想做的很简单,如果可能的话,避免引入第三方框架和类来完成这项工作。 (我使用 Google App Engine 和 Python)
用户通过移动应用程序 (iOS) 登录一次服务。登录后,用户将发出许多请求,以获取消息、好友、状态等信息。因此,每次应用程序与服务器通信时,我们不会发送该用户的电子邮件和密码进行身份验证,而是发送一个 session ID。到目前为止,这只是我对系统的理解。
我想出了一个非常简单的方法,对我来说似乎效果很好,但由于缺乏经验,我可能看不到很多东西。这样做会有什么问题:
在设备上,用户输入电子邮件/密码,凭据将发送到服务器并进行验证,经过身份验证后,会生成一个随机数。该随机数作为 IntegerProperty 存储在用户模型上,名称为 session_number。
session_number 被发送到用户的设备并保存。现在,只要用户连接到服务器发出请求,session_number 就会连同用户的整数 ID 号一起发送到服务器。我们获取该 userId 的 User 实体,现在我们比较 user.session_number ==coming_session_number 的值。如果它们匹配,我们就很好,否则错误。
如果用户注销,我们会从数据存储中清除 session_number。
这里唯一的问题是当用户从多个设备登录时如何处理?每个设备是否应该存储自己的 session_number?
最佳答案
除了我关于重新发明轮子的评论之外;我认为这个理论的主要问题是它完全受到重放攻击。
例如,给定一个 ID 为 99 且 session ID/cookie 为“MONKEY-1”的用户 — 如果该用户想要发送请求,他必须在某些情况下使用“from, 99, MONKEY-1”对其进行签名时尚。让我们假设它是这样的:
{ FROM: 99, TO: SERVER, COMMAND: GET-NEW-MAIL, SESSION: MONKEY-1 }
如果 MONKEY-1 是个 secret 的话那就太好了。 (无论您喜欢什么格式;它也可能是线路噪声的 4KiB 二进制 block 。)
但是现在,我们有一个窃听者,他看到了那个数据包经过……她现在发送了自己的数据包。也许她很聪明,欺骗了真实用户 99 使用的源 IP 地址 - 即使窃听者听不到您的回复,她仍然可以向您发送数据包。也许那个看起来像这样:
{ FROM: 99, TO: SERVER, COMMAND: DELETE-ALL-MAIL, SESSION: MONKEY-1 }
有很多方法可以防止此类事情发生,但效果各不相同。将连接封装在 SSL 中可以使这变得极其困难(但绝不是不可能);这是许多网站所依赖的解决方案。更好的方法是使用散列或公钥/私钥加密技术,使用双向通信来以入侵者无法获取 secret 数据的方式对事物进行签名。例如,假设我们有一个这样的交换:
{ FROM: SERVER, TO: ??, COMMAND: PLEASE-LOGIN, NONCE: PIGEON }
{ FROM: BILL, TO: SERVER, COMMAND: LOGIN, AUTH: hash ( hash ( password ) . "PIGEON" ) }
…其中 hash()
表示 SHA-256 和,. “PIGEON”
指的是串联;
{ FROM: SERVER, TO: BILL, COMMAND: LOGIN-OK, SESSION: hash ( password ) ^ "MONKEY-1" }
... 其中 ^
可能指的是某种操作,例如按位异或。然后,随后,Bill 发送如下请求:
{ FROM: BILL, TO: SERVER, COMMAND: GET-NEW-MAIL, NONCE: "ARMADILLO",
AUTH: hash ( "GET-NEW-MAIL" . #\Newline . "ARMADILLO" . #\Newline . "MONKEY-1" ) }
现在,MONKEY-1 从来没有畅通无阻地旅行过;并且,每个请求上给出的 AUTH key 与所使用的动词或命令以及随机数相关联,该随机数应随每个请求而变化,并且服务器可以轻松验证其完整性,但窃听者无法再次重放相同的消息或更改动词并做一些不同的事情。
解释密码问题:
我有一个数据库表,它包含
User: BILL, Password: hash(DOLPHIN)
如果我通过网络收到
{ FROM: BILL, PASSWORD: hash(DOLPHIN), COMMAND: GET-ALL-MAIL }
...那么窃听者不太可能(但相当合理)知道密码是 DOLPHIN,但是,她不需要知道或关心:
{ FROM: BILL, PASSWORD: hash(DOLPHIN), COMMAND: DELETE-ALL-MAIL }
你提到对密码加盐……你会怎么做?
User: BILL, PASSWORD: hash( SALT . DOLPHIN )
除非您将盐和海豚分开存放,否则没有简单的方法可以从哈希 (SALT . DOLPHIN)
到 哈希 (DOLPHIN)
。因此,要么用户必须向您提交哈希 (SALT . DOLPHIN)
(在客户端放置静态 SALT),要么您必须再次存储明文密码。
解决方法可能是做类似的事情
Database: ( BILL => hash ( SALT . DOLPHIN ) )
Server sends: ( NONCE )
Client sends: ( BILL => hash ( NONCE . hash ( SALT . DOLPHIN ) ) )
关于security - 我的基本用户身份验证方法有什么问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12202571/
在 JSF2 应用程序中遇到验证属性的问题时,有两种主要方法。 使用 Annotation 在 ManagedBean 上定义验证 @ManagedBean public class MyBean {
我想实现一个不常见的功能,我认为 jquery 验证插件将是最好的方法(如果您在没有插件的情况下建议和回答,我们也会欢迎)。我想在用户在输入字段中输入正确的单词后立即隐藏表单。我试过这个: $("
我有几个下拉菜单(类名为month_dropdown),并且下拉菜单的数量不是恒定的。我怎样才能为它们实现 NotEqual 验证。我正在使用 jQuery 验证插件。 这就是我写的 - jQuery
我设法制作了这个网址验证代码并且它起作用了。但我面临着一个问题。我认为 stackoverflow 是获得解决方案的最佳场所。 function url_followers(){ var url=do
我目前正在使用后端服务,该服务允许用户在客户端应用程序上使用 Google Games 库登录。 用户可以通过他们的 gplay ID 向我们发送信息,以便登录或恢复旧帐户。用户向我们发送以下内容,包
我正在尝试验证输入以查看它是否是有效的 IP 地址(可能是部分地址)。 可接受的输入:172、172.112、172.112.113、172.112.113.114 Not Acceptable 输入
我从 Mongoose 验证中得到这条消息: 'Validator failed for path phone with value ``' 这不应该发生,因为不需要电话。 这是我的模型架构: var
我一直在尝试使用Python-LDAP (版本 2.4.19)在 MacOS X 10.9.5 和 Python 2.7.9 下 我想在调用 .start_tls_s() 后验证与给定 LDAP 服务
我正在处理一个仅与 IE6 兼容的旧 javascript 项目(抱歉...),我想仅在 VS 2017 中禁用此项目的 ESLint/CSLint/Javascript 验证/CSS 验证。 我知道
我正在寻找一种方法来验证 Spring 命令 bean 中的 java.lang.Double 字段的最大值和最小值(一个值必须位于给定的值范围之间),例如, public final class W
我正在尝试在 springfuse(JavaEE 6 + Spring Framework (针对 Jetty、Tomcat、JBoss 等)) 和 maven 的帮助下构建我的 webapps 工作
我试图在我们的项目中使用 scalaz 验证,但遇到了以下情况: def rate(username: String, params: Map[String, String]): Validation
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
我有一个表单,人们可以单击并向表单添加字段,并且我需要让它在单击时验证这些字段中的值。 假设我单击它两次并获取 2 个独立的字段集,我需要旋转 % 以确保它在保存时等于 100。 我已放入此函数以使其
在我的页面中有一个选项可以创建新的日期字段输入框。用户可以根据需要创建尽可能多的“截止日期”和“起始日期”框。就像, 日期_to1 || date_from1 日期到2 ||日期_from2 date
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
有没有办法在动态字段上使用 jquery 验证表单。 我想将其设置为必填字段 我正在使用 Jsp 动态创建表单字段。 喜欢 等等...... 我想使用必需的表单字段验证此表单字段。 最佳答
嗨,任何人都可以通过提供 JavaScript 代码来帮助我验证用户名文本框不应包含数字,它只能包含一个字符。 最佳答案 使用正则表达式: (\d)+ 如果找到匹配项,则字符串中就有一个数字。 关于J
我有两个输入字段holidayDate和Description(id=tags) $(document).ready(function() {
我遇到了这个问题,这些验证从电子邮件验证部分开始就停止工作。 我只是不明白为什么即使经过几天的观察,只是想知道是否有人可以在这里指出我的错误? Javascript部分: function valid
我是一名优秀的程序员,十分优秀!