鉴于需要为来自
的oAuth的ConsumerKey / ConsumerSecret交换信息的应用程序- server running "WebApi" over ServiceStack
- consumer is a desktop app
希望使用已经存在的公钥/私钥加密邮件
是否支持加密/解密邮件,希望透明?即加密/解密是通过服务器上的过滤器来处理的吗?
OR
有关如何执行此操作的任何解决方法?
仅供参考 - 服务器已经要求SSL并且请求已经过身份验证,但注册是免费/自动的,因此需要加密
答案 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()),
};
}
}
客户端还需要一个您可以在带外交换的公钥/私钥对的副本。