通过ServiceStack加密消息

时间:2013-04-19 06:49:24

标签: c# .net servicestack

鉴于需要为来自

的oAuth的ConsumerKey / ConsumerSecret交换信息的应用程序
- server running "WebApi" over ServiceStack
- consumer is a desktop app

希望使用已经存在的公钥/私钥加密邮件

是否支持加密/解密邮件,希望透明?即加密/解密是通过服务器上的过滤器来处理的吗?

OR

有关如何执行此操作的任何解决方法?

仅供参考 - 服务器已经要求SSL并且请求已经过身份验证,但注册是免费/自动的,因此需要加密

1 个答案:

答案 0 :(得分:2)

更新

Encrypted Messaging Feature中发布的v4.0.42现在可以为所有服务提供安全通道,为现在可以通过不安全的HTTP轻松发送和接收加密邮件的客户提供保护。


目前ServiceStack内置的消息级加密没有公开支持,尽管这是我们将来考虑添加的内容。下面是一个您今天可以尝试使用ServiceStack进行探索的方法的示例(您需要更多的R& D来提供良好的可靠设计),并且因为这是一个可能在未来发生变化的领域,所以不是我们现在支持的用例,但现在可以使用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; } 
} 

这是一个方便的CryptUtils wrapper,可以轻松创建公钥/私钥以及使用它们加密/解密文本。

然后您可以拥有一项服务,并执行以下操作:

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()), 
        }; 
    } 
} 

客户端还需要一个您可以在带外交换的公钥/私钥对的副本。