Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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
C# 在C中为HMAC SHA1生成公钥和密钥#_C#_Asp.net_Asp.net Mvc 3_Hmacsha1 - Fatal编程技术网

C# 在C中为HMAC SHA1生成公钥和密钥#

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。此服务客户端

我想在Asp.NETMVC3上为RESTAPI服务实现类似HMAC-SHA的签名算法。是否有生成用户公钥和密码的最佳实践?

我们已经构建了一个类似的系统。@James引用提供了非常好的信息。一定要读。如果可能,请仅通过SSL/TLS部署您的服务

使用HMAC-SHA签名,您不需要公钥。服务器(服务)和客户端共享一个用于计算签名的密钥。根据上面提到的安全站点上的问题,确保每个客户端都有不同的密钥

对于每个客户机,您还应该具有某种服务客户机id,该id不同于您必须标识客户机的任何其他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,想知道是否有任何解决方案可以生成可靠的公钥/密钥对。我建议你在网站上问这个问题,我问了一个类似的问题,这可能会对你有所帮助。你从我的回答中获得足够的信息了吗?