C# 在C中为HMAC SHA1生成公钥和密钥#
我想在Asp.NETMVC3上为RESTAPI服务实现类似HMAC-SHA的签名算法。是否有生成用户公钥和密码的最佳实践?我们已经构建了一个类似的系统。@James引用提供了非常好的信息。一定要读。如果可能,请仅通过SSL/TLS部署您的服务 使用HMAC-SHA签名,您不需要公钥。服务器(服务)和客户端共享一个用于计算签名的密钥。根据上面提到的安全站点上的问题,确保每个客户端都有不同的密钥 对于每个客户机,您还应该具有某种服务客户机id,该id不同于您必须标识客户机的任何其他id。此服务客户端id在请求标头中发送,以便您可以识别客户端。一旦识别了客户机,就可以获得有关客户机的所需信息,包括客户机的服务密钥 除了服务客户端id之外,请求头还应该包含生成的实际签名。我还建议在标题中添加一个时间戳(下面将详细介绍)。因此,您的请求将具有与以下类似的标题:C# 在C中为HMAC SHA1生成公钥和密钥#,c#,asp.net,asp.net-mvc-3,hmacsha1,C#,Asp.net,Asp.net Mvc 3,Hmacsha1,我想在Asp.NETMVC3上为RESTAPI服务实现类似HMAC-SHA的签名算法。是否有生成用户公钥和密码的最佳实践?我们已经构建了一个类似的系统。@James引用提供了非常好的信息。一定要读。如果可能,请仅通过SSL/TLS部署您的服务 使用HMAC-SHA签名,您不需要公钥。服务器(服务)和客户端共享一个用于计算签名的密钥。根据上面提到的安全站点上的问题,确保每个客户端都有不同的密钥 对于每个客户机,您还应该具有某种服务客户机id,该id不同于您必须标识客户机的任何其他id。此服务客户端
MySvc-Clientid: ServiceId
MySvc-Signature: Signature
MySvc-Timestamp: TimeStamp
要使用.NET/C生成客户端密钥,可以创建一个方法,该方法生成Rijndael密钥的字符串表示形式,该密钥可以传递给客户端。这里有一个例子
public string CreateServiceClientKey()
{
SymmetricAlgorithm symAlg = SymmetricAlgorithm.Create("Rijndael");
symAlg.KeySize = 128;
byte[] key = symAlg.Key;
StringBuilder sb = new StringBuilder(key.Length * 2);
foreach (byte b in key)
{
sb.AppendFormat("{0:x2}", b);
}
return sb.ToString();
}
在我们的系统中,当启用新的服务客户机时,将生成服务客户机id和服务密钥,并将其存储在客户机的数据库中。服务客户端id只能是GUID
客户端的服务密钥是您和客户端之间的共享秘密。仅通过安全机制将其交付给客户端,例如运行在SSL/TLS上的网站的已验证部分。否则,您将向其他获得密钥的人公开自己
时间戳应由客户机生成,并包含在生成签名的要签名的字符串中。这将为签名添加特定于时间的可变性。AWS也这样做
关于要签名的字符串,在您这方面,我还建议您定义一个接口,在与请求签名进行比较时,您可以编写该接口来构建要签名的字符串。这将允许您为不同的服务甚至不同的操作构建不同的实现。这对我们的实现很有用。以下是一个例子:
public interface IStringToSignBuilder
{
string Build(ServiceSignatureDetails details);
}
/// <summary>
/// Class is a data entity that defines the specific details
/// required for a Service Signature
/// </summary>
public class ServiceSignatureDetails
{
public string HttpMethod { get; set; }
public string ServiceClientId { get; set; }
public string ServiceClientKey { get; set; }
public string UriAbsolutePath { get; set; }
public string DomainName { get; set; }
public string CompanyName { get; set; }
public string DateTimeStamp { get; set; }
public string Data { get; set; }
}
公共接口正在发送给SignBuilder
{
字符串生成(ServiceSignatureDetails详细信息);
}
///
///类是定义特定细节的数据实体
///需要服务签名
///
公共类服务签名详细信息
{
公共字符串HttpMethod{get;set;}
公共字符串ServiceClientId{get;set;}
公共字符串ServiceClientKey{get;set;}
公共字符串URIABSolutionPath{get;set;}
公共字符串域名{get;set;}
公共字符串CompanyName{get;set;}
公共字符串日期时间戳{get;set;}
公共字符串数据{get;set;}
}
然后,您可以构建满足您需要的特定的
IStringToSignBuilder实现,并相应地将正确的实现注入到您的代码中。您考虑过asp的内置成员资格吗?是,我只是在实现我自己的AuthorizeAttribute,想知道是否有任何解决方案可以生成可靠的公钥/密钥对。我建议你在网站上问这个问题,我问了一个类似的问题,这可能会对你有所帮助。你从我的回答中获得足够的信息了吗?