PostSharp字段拦截加密和解密

时间:2014-01-08 07:09:11

标签: encryption field postsharp interception

使用PostSharp我想对字段拦截进行加密/解密

我有一个班级

public class guestbookentry
  {       
    [Encryption]  // This Attribute has to Encrypt and Decrypt
    public string Message { get; set; }
    public string GuestName { get; set; }       
  }

我在Azure Tables中保存对象。只有特定的字段必须得到En / Decrypt。

字段拦截的PostSharp属性

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using PostSharp;
using PostSharp.Aspects;
using EncryptionDecryption;
using PostSharp.Serialization;
using PostSharp.Aspects.Advices;
using PostSharp.Extensibility;

namespace GuestBook_Data
{
[Serializable]
public class EncryptionAttribute : LocationInterceptionAspect 
{      
    [MulticastPointcut(Targets = MulticastTargets.Field, Attributes = MulticastAttributes.Instance)]
    public override void OnSetValue(LocationInterceptionArgs args)
    {
        base.OnSetValue(args);
        if (args.Value != null)
        {             
            MD5CryptoServiceExample objMD5Encrypt = new MD5CryptoServiceExample();
            args.Value = objMD5Encrypt.Encrypt(args.Value.ToString()).Replace(" ", "+");
            args.ProceedSetValue();
        } 
    }

    public override void OnGetValue(LocationInterceptionArgs args)
    {
        base.OnGetValue(args);
        if (args.Value != null)
        {              
            MD5CryptoServiceExample objMD5Encrypt = new MD5CryptoServiceExample();
            args.Value = objMD5Encrypt.Decrypt(args.Value.ToString()); //objMD5Encrypt.Decrypt(args.Value.ToString());
            args.ProceedGetValue();
        }
    } 
}
}

问题是  1.连续加密和解密发生,难以处理。

请建议

1 个答案:

答案 0 :(得分:1)

注意,调用base.OnSetValue(args)与调用args.ProceedSetValue()相同,调用base.OnGetValue(args)与调用args.ProceedGetValue()相同。这意味着您在每个处理程序中调用 proceed 方法两次。

您需要做的是在args.ProceedGetValue()开头致电OnGetValue以阅读加密值,并在args.ProceedSetValue()结束时致电OnSetValue保存加密值。

public override void OnGetValue(LocationInterceptionArgs args)
{
    args.ProceedGetValue();
    if (args.Value != null)
    {
        args.Value = // decrypt
    }
}

public override void OnSetValue(LocationInterceptionArgs args)
{
    if (args.Value != null)
    {
        args.Value = // encrypt
    }
    args.ProceedSetValue();
}

此外,您无需应用[MulticastPointcut]属性。在开发Developing Composite Aspects中描述的复合方面时使用它。