authentication - 了解跨域用户认证

标签 authentication encryption encoding cross-domain http-authentication

目标:Website1 通过 http 请求发送 Website2 用户数据。

问题:Website2 确保数据来自 Website1,而不是某个黑客。

注意:我不会使用 HTTPS,我意识到这会解决一个大问题,但现在 GAE 不支持您自己的域名的 SSL:http://code.google.com/appengine/kb/general.html#httpsapps

因此,我通过在两个站点之间加密和发送数据,而另一个站点能够解密和读取数据,取得了一些重大进展。我使用的是 Google App Engine/Python/Django-nonreal,此页面是让 pycrypto 正常工作的绝佳资源:http://code.activestate.com/recipes/576980/知识点

所以我很高兴知道用户数据已加密并且您需要拥有 key 才能读取它,但是 Website2 如何知道请求来自 Website1?是什么阻止黑客再次发送完全相同的请求,并且 Website2 认为该黑客可以在 Website2 上执行操作?

例如,难道有人不能监听 http 请求并记录通过线路发送的加密数据吗?然后黑客可以使用 Website1 之前使用的相同值执行自己的请求,并且黑客可以对 Website2 执行与 Website1 相同的操作?本质上,黑客会告诉 Website2 他们是 Website1 的有效登录用户。

总体目标:向 Website2 告知仅来自 Website1 请求的用户数据。黑客使用与 Website1 发送到 Website2 相同的加密数据发出的任何其他请求都不会起作用,除非您的 Website1。

不确定我的解释是否足够好,或者我是否有一个非常基本的理解,但感谢您的帮助。

最佳答案

为了防止重放攻击,您需要包含随机数和 MAC(消息验证代码)。

MAC 可以简单地是加密消息内容的 HMAC-SHA1。接收方将计算相同的 MAC 并确保其匹配。 HMAC-SHA1 的 key 必须是双方都知道的 secret 。此步骤很重要 - 仅仅因为您的数据已加密并不意味着它不能被篡改。特别是,如果攻击者只能改变随机数(见下文),那么您就会遇到问题。因此请使用合适的 MAC。

随机数应位于消息的加密部分内,并且仅使用一次。。接收端应记录随机数并拒绝任何具有相同随机数的 future 消息。这是防止重放攻击的关键。

您可以通过为随机数附加一个到期日期来避免保留无限数量的随机数。过期日期后收到的消息应被拒绝。可以在过期日期后从“已见随机数”数据库中删除随机数,加上几个小时来考虑可能的时钟差异。

正确生成随机数可能很棘手。这是一种技术:

  • 当您的应用服务器启动时,创建一个新的虚拟数据存储实体。缓存其 key 以及您的启动时间戳,直到您的应用程序服务器终止。同时创建一个初始化为 0 的计数器。
  • 当您需要随机数时,通过散列(实体 key 、启动时间戳、计数器)生成它。然后递增计数器。

您可以在超过最大预期时钟漂移耗时后删除虚拟数据存储实体。几个小时应该足够了。

关于authentication - 了解跨域用户认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4960592/

相关文章:

c# - 如何在 ASP.NET MVC 中支持具有回退形式的 NTLM 身份验证?

flutter - 即使使用异步,在 Flutter 中进行繁重的计算操作时 UI 也会滞后

javascript - 超出最大调用堆栈大小

iOS - 如何访问全局登录的用户对象?

python - Scrapy,验证码登录失败

使用标准 char 数据类型而不是 wchar_t 的 C 西里尔控制台输入

c# - 在c#中编码和解码安全吗?

python - 如何在python的配置文件中保存密码

asp.net - 在网站 asp.net 中为电子邮件制作登录表单

sql-server - SQL Server PWDEncrypt 值比较