这是一个很好的安全策略吗?

时间:2010-10-04 09:02:27

标签: session hash authentication

我正在努力使网络服务安全 它不适用于银行或类似的任何东西,但使用它的组织可能会失去一些钱,如果该服务将由未经授权的人使用(很难确切地知道多少......)。

目的不是允许未经授权的应用程序使用任何方法(“GetChallenge”除外。对于用户身份验证,有一种不同的机制可以检查用户名和密码。我实际上将两者合并,但它们有不同的用途):

所以这就是我的所作所为:
我发送一个(ASP.NET)会话密钥(供大家阅读.ASP.NET的会话是15个随机生成的字节,除非延长,否则它将持续20分钟,如果没有它,ASP.NET将不会收到任何请求)。
在我的SignIn方法中,除了用户名和密码(任何人都可以获取,因为它是公共站点的一部分),我收到第三个参数 - 会话密钥由md5算法散列,6个字节为盐。
并且只有当哈希值正确时(我正在哈希并在服务器端进行比较) - 我让用户登录。
从那时起,我会检查用户是否已登录。

已添加:用户名和密码以明文形式发送,而则不是问题(不是我至少要解决的问题)。问题是某人(我们正在合作的公司除外)编写使用我的网络服务的应用程序。网络服务只能由授权的应用程序使用 此外,会话ID与每个请求和响应一起来回发送(作为ASP.NET会话机制的一部分。这就是ASP.NET知道如何“跟踪”特定于用户的会话)。很抱歉没有从头开始澄清。
(非理性地认为这是显而易见的)。

安全策略有多强大和有效?

感谢。

4 个答案:

答案 0 :(得分:1)

根据您的编辑和评论更新

它非常安全,与Google,Facebook和其他人用于API密钥的方法非常相似。除了...

会话ID纯文本潜在问题

我建议不要使用会话ID作为安全机制的一部分。

一个问题是通过网络以纯文本传递会话密钥。这可能会打开一些会话劫持和其他攻击。

来自Microsoft Docs

  

SessionID在服务器和浏览器之间以明文形式发送,可以是cookie,也可以是URL。因此,不需要的源可以通过获取SessionID值并将其包含在对服务器的请求中来访问另一个用户的会话。如果您在会话状态中存储私人或敏感信息,建议您使用SSL加密浏览器和包含SessionID的服务器之间的任何通信。

当您使用会话ID作为安全机制的一部分时,我会说这是敏感数据。

确保某人无法获取会话密钥的一种方法是在HTTPS上运行您的服务。就个人而言,我会避免以这种方式使用会话ID,而是生成一个不相关的值。

推荐的更改

更密切地关注Google等使用的模型。为每个应用程序生成新的GUID,将GUID存储在服务器上的数据库中,将每个请求中的GUID从客户端传递到服务器。

Benfits:

  • 唯一标识客户端应用程序,允许您很好地跟踪和管理每个客户端的使用情况
  • 通过从数据存储中删除GUID轻松禁用任何客户端
  • 线路上没有敏感数据

我仍会在HTTPS上运行该服务,因为它易于设置,并且可以保护您发送到服务的任何其他数据。

答案 1 :(得分:0)

  

加密的目的不是为了   允许未经授权的应用程序使   任何方法

错误。加密它的目的是为了防止在传输或存储时理解数据。它可以防止那些无法解密的数据“可用”。

您所描述的内容类似于公钥/私钥系统。您正在向所有人提供会话密钥。然后,只有在他们使用正确的盐(根据您的服务器端比较)md5后,您才会信任该来源。

除了用户名和密码,您在此处没有身份验证。此外,您的数据在传输过程中未加密。我没有看到这是多么安全。

我认为您最好的选择是使用SSL证书(因此您的Web服务通过HTTPS运行)以及用户名和密码。如果您想要加倍安全,您可能需要沿着检查源IP范围和登录位置的路线作为附加检查。在消费者将凭据传递给第三方+审核Web服务实际使用方式的情况下,强制密码更改间隔可能会有所帮助。

作为旁注,如果你想要哈希,不要使用MD5,its broken

答案 2 :(得分:0)

从Web服务的角度来看,使用身份验证或为您的服务提供安全性的理想方式是:Web Service Authentication(Token和MD5 Hashing加密密码)。

答案 3 :(得分:0)

你描述它的方式,它似乎根本不安全。

如果会话密钥是公开的(“供所有人阅读”),让SignIn方法接受散列会话密钥有什么意义?

Plus:“在每种方法中,我都会检查用户是否已登录。”您如何检查?

一种常见(且相当安全)的策略是生成(唯一的,足够长且随机的)会话ID服务器端,并在经过身份验证后将其发送到客户端。然后检查每个客户端请求,只有在包含会话ID时才接受它。要做到这一点,要么将ID嵌入到每个页面的所有链接中,要么将其设置为cookie,具体取决于您更容易。 注销时,只需删除服务器上的会话ID即可。

这样,没有有效会话,没有人可以调用任何方法。