您应该如何使用PXDBCryptString属性解密值

时间:2018-11-30 21:43:00

标签: acumatica

我在DAC中使用以下定义,希望结果在数据库中加密,但在图形类的UI或代码中显示为解密。结果是,它在UI和代码中显示了加密的值。我无法弄清楚如何解密返回的值。

我正在尝试查找有关如何使用此属性的更多信息,但是2018R1-AcumaticaFramework-DevelopmentGuide.pdf仅具有稀疏信息。它具有以下链接PXDBCryptLink https://help.acumatica.com/Main?ScreenId=ShowWiki&pageid=176377a7-4d01-786c-a56d-e17ccbf188f0,但该链接似乎不再可用。我也无法在T200文档中找到任何内容。

有人知道如何正确解密使用此属性的值吗?

预先感谢

    #region C2PAPIKEY
    public abstract class c2PAPIKEY : PX.Data.IBqlField
    {
    }
    protected string _C2PAPIKEY;
    //[PXDBString(50, IsUnicode = true)]
    //not having any luck getting these encryption attributes to work
    //the value coming back is always encrypted regardless of the
    //IsVeiwDecrypted being set to true
    //[PXRSACryptString(50, IsUnicode = true, IsViewDecrypted = true)]
    [PXDBCryptString(50, IsUnicode = true, IsViewDecrypted = true)]
    [PXDefault("")]
    [PXUIField(DisplayName = "Click to Pay API Key")]
    public virtual string C2PAPIKEY
    {
        get
        {
            return this._C2PAPIKEY;
        }
        set
        {
            this._C2PAPIKEY = value;
        }
    }
    #endregion

2 个答案:

答案 0 :(得分:0)

我看过一些示例,我相信必须在缓存中显式解密该值。

这可以在图形中使用RowSelected事件处理程序完成:

// Make sure DAC is of the type that holds the C2PAPIKEY field
public virtual void DAC_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
    PXDBCryptStringAttribute.SetDecrypted<DAC.c2PAPIKEY>(sender, e.Row, true);
}

答案 1 :(得分:0)

我发现我遇到的问题是我没有在数据库中授予足够的空间来存储加密的值。 一个32个字符的密钥将需要88个字符来存储完整的加密字符串。我将字段定义为nvarchar(50),因此加密值被截断,导致加密机制无法解密该值。 我希望这对某人有帮助。