2010-10-04 69 views
1

我正在尝试使Web服务安全。
这不适用于银行或其他任何类型的服务,但如果某个未经授权的人使用该服务(很难确切知道该付多少钱),那么使用该服务的组织可能会损失一些钱。这是一个很好的安全策略吗?

目的是不允许未经授权的应用使用任何方法(不是“GetChallenge”等。对用户的认证有不同的机制,检查用户名和密码。我其实两者相结合,但它们服务于不同目的):

因此,这里是我做什么:
给我寄了(ASP.NET)会话密钥(给大家看了ASP.NET的会话15个随机生成的字节,它活了20分钟,除非延长,没有它,ASP.NET将不会收到任何请求)。
在我的SignIn方法中,除了用户名和密码(任何人都可以获取,因为它是公共站点的一部分)之外,我收到第三个参数 - 会话密钥由md5算法散列,其中6个字节为salt。
且仅当散列是正确的(我散列,它在服务器端进行比较) - 我让用户登录
从此在每一个方法,我检查,如果用户在签署

加了:用户名和密码以明文形式发送,并且这不是问题(不是我至少要解决的问题)。问题是有人(与我们合作的公司除外)编写使用我的Web服务的应用程序。网络服务只能由授权应用程序使用。
此外,会话ID会随每个请求和响应一起发送(作为ASP.NET会话机制的一部分,这就是ASP.NET知道如何“跟踪”特定于用户的会话)。对不起,从第一个地方不澄清。
(非理性认为这很明显)。

安全策略的强大和有效性如何?

谢谢。

+1

我看不到在您的系统中实际使用加密的地方。哈希!=加密 – knittl 2010-10-04 09:10:08

+0

@ knittl:是的,我现在看到了,但我的意思是广义上的。也许“安全”更好? – 2010-10-04 09:14:55

+0

安全性绝对好于加密 – knittl 2010-10-04 09:15:48

回答

1

更新根据您的编辑和评论

它非常安全,非常类似于他们的API密钥使用谷歌,Facebook和其他人的做法。除...

会话ID明文潜在问题

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

一个问题是在整个网络中以纯文本传递会话密钥。这可能会导致一些会话劫持和其他攻击。

Microsoft Docs

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

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

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

推荐变化

更紧贴由谷歌之类的模型。为每个应用程序生成一个新的GUID,将GUID存储在服务器上的数据库中,将每个请求中的GUID从客户端传递到服务器。

Benfits:

  • 标识客户端应用独特,让您跟踪和管理每个客户端的使用很好地
  • 从您的数据存储
  • 没有敏感数据在取下GUID容易地禁止任何客户端线

我仍然会运行在HTTPS服务,因为它很容易设置,并提供了额外的好处,保护任何其他数据你发送到你的服务。

+0

我的错误,应该补充说,ASP.NET会话密钥只能存活大约20分钟,只存在于特定会话中,并且除非没有有效会话密钥的请求,否则ASP.NET不会。这就是为什么我使用它,而不是,例如用户名的散列,一旦用户得到散列,可以随时使用。 – 2010-10-04 09:49:32

+0

谢谢,这很有启发性,但我没有得到一些东西(这可能很简单) - 如果你发送和接收GUID(这是一个常量字符串),有人不能“劫持”它吗? – 2010-10-04 10:41:37

+0

@Oren A - 如果在运输过程中受到保护(即使用HTTPS) – 2010-10-04 11:04:22

0

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

错误。加密它的目的是防止在传输或存储时理解数据。它阻止了那些没有解密手段的数据“可用”。

您所描述的内容与公钥/私钥系统类似。您正在让每个人都可以使用会话密钥。然后,只有在他们使用正确的salt(根据您的服务器端比较)md5之后,您才会信任该源。

除了用户名和密码之外,您还没有验证。您的数据在传输过程中也未加密。我不明白这是如何安全的。

我认为你最好打赌是使用SSL证书(因此你的Web服务通过HTTPS运行)以及用户名和密码。如果您希望双重安全,您可能需要按照检查源IP范围和登录位置的路线进行额外检查。也许强制密码更改间隔将有助于消费者向第三方传递证书的情况+审核Web服务实际使用的方式。

作为一个附注,如果你想散列的东西不使用MD5,its broken

+0

OP已将其帖子从**加密**更正为**安全**。尽管如此,MD5现在很容易破碎。 SHA256更好。不知道现在什么是最安全的哈希,任何人? – 2010-10-04 09:33:20

+0

SHA256还是不错的。 – teedyay 2010-10-04 10:07:08

+0

我无法弄清楚,如果MD5链接与我有关。我没有使用证书,我为我自己的使用哈希值。 – 2010-10-04 10:50:23

0

从Web服务的角度来看,使用身份验证或为您的服务提供安全性的理想方式如下所示:Web Service Authentication(令牌和MD5哈希来加密密码)。

0

您描述它的方式看起来似乎并不安全。

如果会话密钥是公开的(“供大家阅读”),让SignIn方法接受散列会话密钥的要点是什么?

另外:“在每种方法中,我检查用户是否登录。”你如何检查?

一种常见的(合理安全的)策略是生成一个(唯一的,足够长的和随机的)会话ID服务器端,并在认证之后将其发送给客户端。然后检查每个客户端请求,只有包含会话ID才接受它。要做到这一点,要么将ID嵌入到每个页面上的所有链接中,要么将其设置为Cookie,具体取决于您更容易使用哪些内容。 注销时,只需删除服务器上的会话ID。

这样,没有人可以在没有有效会话的情况下调用任何方法。