Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net HMAC和WCF服务.net_Asp.net_Wcf_Wcf Data Services_Wcf Security_Hmac - Fatal编程技术网

Asp.net HMAC和WCF服务.net

Asp.net HMAC和WCF服务.net,asp.net,wcf,wcf-data-services,wcf-security,hmac,Asp.net,Wcf,Wcf Data Services,Wcf Security,Hmac,所以我对HMAC认证非常陌生,我真的不知道我在做什么,也不知道我在读atm 我一直在努力正确理解以下文章/链接/讨论: 话虽如此,我有几个问题: 了解第一个链接,例如,如果我有一个在.net中创建的登录身份验证服务,并且将从iPhone应用程序访问,我是否为此传递了一个未加密的用户名消息,并且应该只返回真/假,或者应该返回一个加密字符串,我稍后将在其中用于其他事务删除,插入服务等 [ServiceContract] public partial class LoginService { [

所以我对HMAC认证非常陌生,我真的不知道我在做什么,也不知道我在读atm

我一直在努力正确理解以下文章/链接/讨论:

话虽如此,我有几个问题:

了解第一个链接,例如,如果我有一个在.net中创建的登录身份验证服务,并且将从iPhone应用程序访问,我是否为此传递了一个未加密的用户名消息,并且应该只返回真/假,或者应该返回一个加密字符串,我稍后将在其中用于其他事务删除,插入服务等

[ServiceContract]

public partial class LoginService
{

 [OperationContract]
 bool Authenticate(string username) {
   // stuffs
 }
}

也就是说,在我验证了用户之后,这就是我迷路的地方。有人告诉我这件事,我也读了一些关于这件事的讨论,我在数据库中“用时间戳”保存一些东西是否更好?或者我只是根据第一个问题返回加密消息,以便每次发出请求时时间戳都已附加

a。我该怎么处理这个时间戳呢

b。一旦消息再次发送到另一个事务,是否将使用它

钥匙和秘密信息。我的理解是,密钥将是用户的密码。那么,如果用户发送他的用户名,我可以使用该用户的密码打开该消息?如果用户已经有一个会话,并且只是请求获取数据或请求删除、插入等,那么这是有意义的。如果只是验证用户的用户名和密码,是否仍应采用相同的方式


谢谢你抽出时间

我首先要提到的是,WCF Web Api是一个测试版项目,不再开发。它被ASP.NETWebAPI所取代,ASP.NETWebAPI是一个非常棒的开发RESTful服务的框架

如果您想了解RESTful服务和身份验证的工作原理,Netflix API将是一个很好的起点。他们有很多关于安全部分的文档,这帮助我更了解HMAC

HMAC使用密钥创建哈希。客户机和服务器都维护密钥的副本,以便生成匹配的哈希。这允许您“签署”一个请求,该请求既可以作为身份验证,也可以作为消息完整性验证,即您知道发送该请求的人是他们所说的人,并且知道他们发送的消息是原始消息且未被篡改

签名是通过组合创建的

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项及其密钥副本来重新创建签名。如果签名匹配,则一切正常

在通过普通HTTP而不是通过ssl使用HTTPS的RESTful API中,我将对发送的每个请求进行签名,因为这再次验证并提供消息完整性。否则,如果您只发送一个身份验证令牌,您知道用户已通过身份验证,但是如果您没有要与HMAC哈希进行比较的消息摘要,您如何知道消息未被篡改

实现签名服务器端检查的一种简单方法是覆盖System.Web.Http.Authorization属性的OnAuthorization确保不使用Mvc autorize属性。让它重新生成签名,就像您在客户端使用他们的密钥所做的那样,如果不匹配,您可以返回401。然后,可以使用新的authorize属性修饰所有需要身份验证的控制器

希望这有助于澄清你的一些困惑,不会让水变得更加浑浊。如果您需要,我可以稍后提供一些更具体的示例

参考资料:

Netflix Api文档:转到关于创建签名的部分,它们还有一个链接,显示了创建HMAC签名的完整.NET示例

用于创建HMAC签名的.NET类

我写的Netflix API包装器:


ASP.NET Web API:

我想提到的第一件事是,WCF Web API是一个测试版项目,不再开发。它被ASP.NETWebAPI所取代,ASP.NETWebAPI是一个非常棒的开发RESTful服务的框架

如果您想了解RESTful服务和身份验证的工作原理,Netflix API将是一个很好的起点。他们有很多关于安全部分的文档,这帮助我更了解HMAC

HMAC使用密钥创建哈希。客户机和服务器都维护密钥的副本,以便生成匹配的哈希。这允许您“签署”一个请求,该请求既可以作为身份验证,也可以作为消息完整性验证,即您知道发送该请求的人是他们所说的人,并且知道他们发送的消息是原始消息且未被篡改

签名是通过组合创建的

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项及其副本 重新创建签名的密钥。如果签名匹配,则一切正常

在通过普通HTTP而不是通过ssl使用HTTPS的RESTful API中,我将对发送的每个请求进行签名,因为这再次验证并提供消息完整性。否则,如果您只发送一个身份验证令牌,您知道用户已通过身份验证,但是如果您没有要与HMAC哈希进行比较的消息摘要,您如何知道消息未被篡改

实现签名服务器端检查的一种简单方法是覆盖System.Web.Http.Authorization属性的OnAuthorization确保不使用Mvc autorize属性。让它重新生成签名,就像您在客户端使用他们的密钥所做的那样,如果不匹配,您可以返回401。然后,可以使用新的authorize属性修饰所有需要身份验证的控制器

希望这有助于澄清你的一些困惑,不会让水变得更加浑浊。如果您需要,我可以稍后提供一些更具体的示例

参考资料:

Netflix Api文档:转到关于创建签名的部分,它们还有一个链接,显示了创建HMAC签名的完整.NET示例

用于创建HMAC签名的.NET类

我写的Netflix API包装器:


ASP.NET Web API:

依次查看您的问题

…我是否为此传递未加密的用户名消息,并应仅返回true/false,还是应返回加密字符串,稍后我将在其中用于其他事务删除、插入服务等

如果您只是返回一个布尔值,那么您将无法将身份验证请求与后续请求相匹配。您需要返回某种身份验证指示符,在经典网站上,这将是会话cookie,在您的实例中,您希望传递一个用作共享密钥的值

在数据库中保存“带有时间戳”的内容是否更好?或者我只是将其与加密消息一起返回,以便每次发出请求时时间戳都已附加

回到会话类比,您想将问题1中的密钥存储在数据库的某个位置吗?带有指示会话寿命/密钥有效性的时间戳。如果它是永久的,那么我就不会为时间戳而烦恼,如果它是其他的东西,当它过期时,你需要说些什么

我的理解是,密钥将是用户的密码。那么,如果用户发送他的用户名,我可以使用该用户的密码打开该消息?如果用户已经有一个会话,并且只是请求获取数据或请求删除、插入等,那么这是有意义的。如果只是验证用户的用户名和密码,是否仍应采用相同的方式

这就是发生碰撞的地方。你有你共同的秘密,你有一条信息,这就是我通常把它们结合在一起的方式

使用所有消息作为要散列的数据体,这样可以确保有人不仅仅复制了散列和消息的一部分。使用我们在第一步中共享的密钥散列消息体。如果需要的话,你可以给它加盐,我会用用户名


最后,最好确保消息包含UTC时间戳,这样有助于防止以后重播消息。响应消息的服务可以将时间戳与它认为的时间进行比较。如果超出给定的界限,则消息失败。因为时间戳将是HMAC的一部分,所以有些人不能只更新日期并重播消息,消息一旦被篡改,哈希值将不匹配。

依次查看您的问题

…我是否为此传递未加密的用户名消息,并应仅返回true/false,还是应返回加密字符串,稍后我将在其中用于其他事务删除、插入服务等

如果您只是返回一个布尔值,那么您将无法将身份验证请求与后续请求相匹配。您需要返回某种身份验证指示符,在经典网站上,这将是会话cookie,在您的实例中,您希望传递一个用作共享密钥的值

在数据库中保存“带有时间戳”的内容是否更好?或者我只是将其与加密消息一起返回,以便每次发出请求时时间戳都已附加

回到会话类比,您想将问题1中的密钥存储在数据库的某个位置吗?带有指示会话寿命/密钥有效性的时间戳。如果它是永久的,那么我就不会为时间戳而烦恼,如果它是其他的东西,当它过期时,你需要说些什么

我的理解是,密钥将是用户的密码。那么,如果用户发送他的用户名,我可以使用该用户的密码打开该消息?如果用户已经有一个会话,这是有意义的 d只是请求获取数据或请求删除、插入等。如果只是验证用户的用户名和密码,是否仍应采用相同的方式

这就是发生碰撞的地方。你有你共同的秘密,你有一条信息,这就是我通常把它们结合在一起的方式

使用所有消息作为要散列的数据体,这样可以确保有人不仅仅复制了散列和消息的一部分。使用我们在第一步中共享的密钥散列消息体。如果需要的话,你可以给它加盐,我会用用户名


最后,最好确保消息包含UTC时间戳,这样有助于防止以后重播消息。响应消息的服务可以将时间戳与它认为的时间进行比较。如果超出给定的界限,则消息失败。因为时间戳将是HMAC的一部分,所以有些人不能只更新日期并重播消息,消息一旦被篡改,哈希就不会匹配。

Nonce代表“使用一次的数字”。所以你永远不想发送两次相同的nonce。它实际上可以是递增的数字、随机字母/数字,或者我通常喜欢使用GUID,因为它们被设计为唯一且易于创建的GUID.NewGuid.ToString。在服务器端,它可以像一个.txt文件一样简单,其中包含已使用的每个nonce,如果您已经在使用数据库,则可以有一个充满nonce的表。然后,每次验证请求时,您只需确保他们提供的nonce尚未使用,否则可能是有人试图重播以前的消息。如果您不想使用时间戳、nonce和hmac哈希对每个请求进行签名,而宁愿使用一次验证方法,我建议使用表单验证。这最初是与原始asp.net webforms一起使用的,但它实际上可以在许多其他场景中很好地工作。它的工作原理是调用身份验证服务,如果提供了正确的凭据,则创建一个加密的身份验证令牌,然后在cookie中传回。现在,每当用户发送另一个请求,比如/GetAptDetails,该令牌也会被传递。ASP.NET将代表您处理所有身份验证详细信息。您可以指定令牌的有效期,甚至可以将用户名存储在令牌中,这样您就可以在后续请求中始终识别用户。根据组或权限的不同,不同的用户将有权访问api的不同区域。如果您不想使用Cookie,还应该有一个无Cookie版本,其中auth令牌以查询字符串形式传递。consumer_密钥将等同于用户名,但不需要易于识别。每个用户都有一个消费者密钥和一个消费者密钥。由于机密永远不会以明文形式发送,并且总是与其他信息一起散列,因此您需要使用consumer_密钥查找他们的consumer_机密副本,以便他们可以创建等效的hmac散列。这不仅让您知道它们已通过身份验证,但是,既然你知道他们是谁,你就可以为不同级别的api提供授权。如果时间戳仅适用于10分钟,那么从技术上讲,你可以每10分钟清除一次Nonce,因为如果有人试图重用其中一个Nonce,时间戳将过期并失效。Nonce代表“使用的编号”一旦所以你永远不想发送两次相同的nonce。它实际上可以是递增的数字、随机字母/数字,或者我通常喜欢使用GUID,因为它们被设计为唯一且易于创建的GUID.NewGuid.ToString。在服务器端,它可以像一个.txt文件一样简单,其中包含已使用的每个nonce,如果您已经在使用数据库,则可以有一个充满nonce的表。然后,每次验证请求时,您只需确保他们提供的nonce尚未使用,否则可能是有人试图重播以前的消息。如果您不想使用时间戳、nonce和hmac哈希对每个请求进行签名,而宁愿使用一次验证方法,我建议使用表单验证。这最初是与原始asp.net webforms一起使用的,但它实际上可以在许多其他场景中很好地工作。它的工作原理是调用身份验证服务,如果提供了正确的凭据,则创建一个加密的身份验证令牌,然后在cookie中传回。现在,每当用户发送另一个请求,比如/GetAptDetails,该令牌也会被传递。ASP.NET将代表您处理所有身份验证详细信息。您可以指定令牌的有效期,甚至可以将用户名存储在令牌中,这样您就可以在后续请求中始终识别用户。根据组或权限的不同,不同的用户将有权访问api的不同区域。如果你不想
o使用Cookie应该有一个无Cookie版本,在该版本中,身份验证令牌以查询字符串的形式传递。消费者密钥将等同于用户名,但不需要易于识别。每个用户都有一个消费者密钥和一个消费者密钥。由于机密永远不会以明文形式发送,并且总是与其他信息一起散列,因此您需要使用consumer_密钥查找他们的consumer_机密副本,以便他们可以创建等效的hmac散列。这不仅让您知道它们已通过身份验证,但既然你知道他们是谁,你就可以为不同级别的api提供授权。如果时间戳只适用于10分钟,那么从技术上讲,你可以每10分钟清除一次nonce,因为如果有人试图重用其中一个nonce,时间戳将过期并失效。