通过ServiceStack加密消息
本文关键字:消息 加密 ServiceStack 通过 | 更新日期: 2023-09-27 18:09:53
给定一个应用程序需要从
交换诸如ConsumerKey/ConsumerSecret的oAuth信息- server running "WebApi" over ServiceStack
- consumer is a desktop app
希望使用已经存在的公钥/私钥加密消息
是否支持加密/解密消息,希望是透明的?即加密/解密是通过服务器上的过滤器来处理的?
或
有什么解决办法吗?
仅供参考—服务器已经要求SSL并且请求经过身份验证,但是注册是免费的/自动的,因此需要加密
更新
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()),
};
}
}
客户端还需要您将在带外交换的公钥/私钥对的副本。