加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用LINQ查询加密值

发布时间:2020-12-15 21:41:31 所属栏目:百科 来源:网络整理
导读:我有一个用户类,其中包含我需要保存在DB加密的用户名 public abstract class User{ public virtual int Id { get; protected set; } public virtual string Username { get { return _encryptionProvider.Decrypt(SecuredUsername); } protected set { Secur
我有一个用户类,其中包含我需要保存在DB加密的用户名

public abstract class User
{
    public virtual int Id { get; protected set; }
    public virtual string Username
    {
        get
        {
            return _encryptionProvider.Decrypt(SecuredUsername);
        }
        protected set
        {
            SecuredUsername = _encryptionProvider.Encrypt(value);
        }
    }
    [Obsolete("Use the 'Username' property -- this property is only to be used by NHibernate")]
    protected virtual string SecuredUsername { get; set; }
}

我将User实体映射如下:

public class UserMapping : ClassMap<User>
{
    public UserBaseMapping()
    {
        Id(user => user.Id).GeneratedBy.HiLo("100");
        Map(Reveal.Member<UserBase>("SecuredUsername")).Unique();
    }
}

它工作正常,直到我不得不写一些LINQ语句.

User user = _session.QueryOver<User>().Where(x => x.Username == "Hamza").SingleOrDefault();

这里的问题是,当LINQ将上述语句转换为SQL时,它变成如下所示:
从[dbo]中选择*.[用户]用户名如’Hamza’

正如您可能已经注意到,表中没有名为username的列但securedusername包含加密值
任何人都可以帮我解决这个问题,我需要能够使用LINQ进行查询.

解决方法

您可以使用自定义类型来加密您的用户名(而不是在User类中进行加密,在自定义类型中进行加密)请参阅 http://nhforge.org/blogs/nhibernate/archive/2009/02/22/encrypting-password-or-other-strings-in-nhibernate.aspx

查询时,您只能查询完全匹配,但您可以执行以下查询:

User user = _session.QueryOver<User>()
    .Where(x => x.Username == "Hamza")
    .SingleOrDefault();

如果要匹配大小写不敏感,可以将值转换为自定义类型中的大写/小写.

如果你想做LIKE搜索,那么你需要看一些其他类型的索引 – 例如. Lucene.NET和NHibernate.Search

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读