servicestack,C#,.net,servicestack" /> servicestack,C#,.net,servicestack" />

C# 通过ServiceStack加密消息

C# 通过ServiceStack加密消息,c#,.net,servicestack,C#,.net,servicestack,给定一个应用程序,该应用程序需要从中交换信息,如ConsumerKey/ConsumerCret for oAuth - server running "WebApi" over ServiceStack - consumer is a desktop app 希望使用已有的公钥/私钥对消息进行加密 是否支持对消息进行加密/解密(希望是透明的)?i、 e.加密/解密通过服务器上的过滤器进行处理 或 关于如何做到这一点,有什么解决办法吗 仅供参考-服务器已经需要SSL,并且请求经过身份验证,但是

给定一个应用程序,该应用程序需要从中交换信息,如ConsumerKey/ConsumerCret for oAuth

- server running "WebApi" over ServiceStack
- consumer is a desktop app
希望使用已有的公钥/私钥对消息进行加密

是否支持对消息进行加密/解密(希望是透明的)?i、 e.加密/解密通过服务器上的过滤器进行处理

关于如何做到这一点,有什么解决办法吗

仅供参考-服务器已经需要SSL,并且请求经过身份验证,但是注册是免费/自动的,因此需要加密更新 现在发布的为所有服务提供安全通道,为现在可以通过不安全HTTP轻松发送和接收加密消息的客户端提供保护


目前还没有发布对内置在中的消息级加密的支持,尽管我们正在考虑将来添加这一功能。下面是一个示例,您今天可以尝试使用ServiceStack进行探索(这将需要您进行更多的研发,才能提出一个好的可靠设计),由于这是一个未来可能会发生变化的领域,我们现在不支持这一用例,但这里有一些东西可以像现在这样使用ServiceStack:

class EncryptedRequest 
{ 
    //Name of the request type 
    public string Type { get; set; }

    //Serialized Request DTO using something like JSON 
    public string EncryptedBody { get; set; }

    //optional: let server the private key that was used (if multiple) 
    public string PrivateKeyMd5Hash { get; set; }
} 

class EncryptedResponse 
{ 
    //Name of the response type 
    public string Type { get; set; } 

    //Serialized Response DTO 
    public string EncryptedBody { get; set; } 

    //optional 
    public string PublicKeyMd5Hash { get; set; } 
} 
这是一个方便的方法,可以轻松创建公钥/私钥,并使用它们对文本进行加密/解密

然后,您可以使用单一服务,并执行以下操作:

class EncryptedService : Service 
{ 
    const string PublicKey = ...; 
    const string PrivateKey = ...; 

    EncryptedResponse Any(EncryptedRequest request) 
    { 
        var requestType = Type.GetType("{0}.{1}" 
            .Fmt(typeof(EncryptedRequest).Namespace, request.Type)); 

        var json = CryptUtils.Decrypt(PrivateKey, request.EncryptedBody); 
        var requestDto = JsonSerializer.DeserializeFromString(json,requestType); 
        var responseDto = GetAppHost().Config.ServiceController
            .Execute(requestDto, base.RequestContext); 

        return new EncryptedResponse { 
           Type = responseDto.GetType().Name, 
           EncryptedBody = CryptUtils.Encrypt(PublicKey, responseDto.ToJson()), 
        }; 
    } 
} 

客户端还需要一份公钥/私钥对的副本,您可以在带外进行交换

GetAppHost().Config.ServiceController中的GetAppHost()未解析,看起来它已更改为GetResolver(),但无法使其工作!有什么建议吗?谢谢你只是需要投下它。这只是出于探索的目的,我将把其余的留给您去研究,因为我没有更多的时间花在这上面。@mythz自从您写了这篇文章以来,框架中有没有关于解密请求的更新内容?