为了账号安全,请及时绑定邮箱和手机立即绑定

在写入/读取到 c# mongo db 时加密/解密属性

在写入/读取到 c# mongo db 时加密/解密属性

C#
呼唤远方 2022-10-23 15:07:26
只是要列出我拥有的所有信息:简而言之,我正在寻找与 ASP Core (2.2) 和 C# MongoDB Driver (2.7) 完全(字面意思)类似的东西。这似乎是一个常见的要求,我很惊讶我找不到任何已经建成的东西。这是我到目前为止所拥有的:模型:public class Patient{    //comes from the client as XXXXXXXXX, RegEx: "([0-9]{9})"    //[MongoEncrypt]    public EncryptedString SocialSecurityNumber { get; set; }  }属性:[AttributeUsage(AttributeTargets.Property)]public class MongoEncryptAttribute : BsonSerializerAttribute{    public MongoEncryptAttribute()    {        SerializerType = typeof(MongoEncryptSerializer);    }}自定义序列化器:public interface IMongoEncryptSerializer : IBsonSerializer<EncryptedString>{ }public class MongoEncryptSerializer : SerializerBase<EncryptedString>, IMongoEncryptSerializer{    private readonly string _encryptionKey;    public MongoEncryptSerializer(IConfiguration configuration)    {        _encryptionKey = configuration.GetSection("MongoDb")["EncryptionKey"];    }    public override EncryptedString Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)    {        var encryptedString = context.Reader.ReadString();        return AesThenHmac.SimpleDecryptWithPassword(encryptedString, _encryptionKey);    }    public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, EncryptedString value)    {        var encryptedString = AesThenHmac.SimpleEncryptWithPassword(value, _encryptionKey);        context.Writer.WriteString(encryptedString);    }}
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

我的解决方案:


模型:


public class Patient

{

    //comes from the client as XXXXXXXXX, RegEx: "([0-9]{9})"

    public EncryptedString SocialSecurityNumber { get; set; }  

}

自定义类型:


public class EncryptedString

{

    private readonly string _value;


    public EncryptedString(string value)

    {

        _value = value;

    }


    public static implicit operator string(EncryptedString s)

    {

        return s._value;

    }


    public static implicit operator EncryptedString(string value)

    {

        if (value == null)

            return null;


        return new EncryptedString(value);

    }

}

序列化器(使用确定性加密):


public interface IEncryptedStringSerializer : IBsonSerializer<EncryptedString> {} 


public class EncryptedStringSerializer : SerializerBase<EncryptedString>, IEncryptedStringSerializer

{

    private readonly IDeterministicEncrypter _encrypter;

    private readonly string _encryptionKey;


    public EncryptedStringSerializer(IConfiguration configuration, IDeterministicEncrypter encrypter)

    {

        _encrypter = encrypter;

        _encryptionKey = configuration.GetSection("MongoDb")["EncryptionKey"];

    }


    public override EncryptedString Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)

    {

        var encryptedString = context.Reader.ReadString();

        return _encrypter.DecryptStringWithPassword(encryptedString, _encryptionKey);

    }


    public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, EncryptedString value)

    {

        var encryptedString = _encrypter.EncryptStringWithPassword(value, _encryptionKey);

        context.Writer.WriteString(encryptedString);

    }

}

注册序列化器:


collection.AddScoped<IEncryptedStringSerializer, EncryptedStringSerializer>();

//then later...

BsonSerializer.RegisterSerializer<EncryptedString>(sp.GetService<IEncryptedStringSerializer>());


查看完整回答
反对 回复 2022-10-23
  • 1 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信