所以我对 HMAC 身份验证非常陌生,我真的不知道自己在做什么,也不知道读 atm。
我一直在尝试正确理解以下文章/链接/讨论:
How to implement HMAC Authentication in a RESTful WCF API
http://buchananweb.co.uk/security01.aspx
话虽如此,我有几个问题:
了解第一个链接,例如,如果我在 .net 中创建了一个 loginAuthentication 服务,并且将从 iPhone 应用程序进行访问,我是否为此传递未加密的用户名(消息)并且应该仅返回 true/false或者它应该返回一个加密字符串,我稍后将在其中用于其他事务(删除、插入服务等)?
[ServiceContract] public partial class LoginService { [OperationContract] bool Authenticate(string username) { // stuffs }
}
话虽如此,在我验证了用户之后,这就是我迷失的地方。我在数据库中保存“带有时间戳”的内容是否更好(有人告诉我这件事,我也读了一些关于这方面的讨论)?或者我是否只用加密消息返回它(取决于第一个问题),以便每次发出请求时都已附加时间戳?
a.我该如何处理该时间戳?
b.一旦消息再次发送用于另一个事务,它会被使用吗?
key 和 secret 消息。我的理解是 key 是用户的密码。那么,如果用户发送他的用户名,我可以使用该用户的密码打开该消息吗?如果用户已经有一个 session 并且只是请求获取数据或请求删除、插入等,那么这是有意义的。如果只是验证用户的用户名和密码,是否仍然应该采用相同的方式?
感谢您的宝贵时间!
最佳答案
我想提的第一件事是,WCF Web Api 是一个不再开发的测试项目。它被 ASP.NET Web API 取代,这是一个用于开发 RESTful 服务的出色框架。
如果您想了解 RESTful 服务和身份验证的工作原理,Netflix API 将是一个很好的起点。他们有很多关于安全部分的文档,这帮助我更多地了解 HMAC。
HMAC 使用 key 创建哈希。客户端和服务器都维护 key 的副本,以便它们可以生成匹配的哈希值。这允许您“签署”请求,该请求既可以作为身份验证(您知道发送请求的人就是他们所说的人),又可以作为消息完整性(知道他们发送的消息是原始消息并且未被篡改)。
签名是通过组合创建的
1. Timestamp (unix epoc is the easiest to send in urls)
2. Nonce (a random number that can never be used twice to protect against someone re-using it)
3. Message (for a GET request this would be the URL, a POST would be the whole body)
4. Signature (the three previous items combined and hashed using the secret key)
以上每一项都可以在请求的查询字符串中发送,然后服务器可以使用前 3 项及其 key 副本来重新创建签名。如果签名匹配,那么一切都很好。
在基于普通 HTTP 的 RESTful API(不通过 ssl 使用 HTTPS)中,我会对发送的每个请求进行签名,因为这再次进行身份验证并提供消息完整性。否则,如果您只是发送身份验证 token ,您就知道用户已通过身份验证,但如果您没有消息摘要(HMAC 哈希)进行比较,您如何知道消息没有被篡改?
实现服务器端签名检查的一个简单方法是重写 System.Web.Http.AuthorizeAttribute 的 OnAuthorization(确保不使用 Mvc autorize 属性)。让它重建签名,就像您在客户端使用其 key 一样,如果不匹配,您可以返回 401。然后您可以使用新的授权属性来装饰所有需要身份验证的 Controller 。
希望这有助于消除您的一些困惑,并且不会让事情变得更加困惑。如果您需要,我稍后可以提供一些更具体的示例。
引用文献:
Netflix Api 文档: http://developer.netflix.com/docs/Security#0_18325 (转到有关创建签名的部分,他们还有一个链接,其中显示了用于创建 HMAC 签名的完整 .NET 示例)
用于创建 HMAC 签名的 .NET 类 http://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs
我编写的 Netflix API 包装器:https://bitbucket.org/despertar1318/netflix-api/overview
ASP.NET Web API:http://www.asp.net/web-api
关于asp.net - HMAC 和 WCF 服务 .net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13589491/