通过ServiceStack加密消息

本文关键字:消息 加密 ServiceStack 通过 | 更新日期: 2023-09-27 18:09:53

给定一个应用程序需要从

交换诸如ConsumerKey/ConsumerSecret的oAuth信息
- server running "WebApi" over ServiceStack
- consumer is a desktop app

希望使用已经存在的公钥/私钥加密消息

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

有什么解决办法吗?

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

通过ServiceStack加密消息

更新

v4.0.42中发布的加密消息功能现在为所有服务启用了一个安全通道,为客户端提供保护,客户端现在可以轻松地通过不安全的HTTP发送和接收加密消息。


目前ServiceStack中还没有发布对消息级加密的支持,尽管这是我们将来考虑添加的东西。下面是一个示例,您可以尝试使用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; } 
} 

这是一个方便的CryptUtils包装器,可以很容易地创建公钥/私钥,以及能够加密/解密使用它们的文本。

那么你可以有一个单一的服务,并做如下的事情:

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

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