【问题标题】:String comparisons while getting passwords获取密码时的字符串比较
【发布时间】:2014-02-17 22:11:17
【问题描述】:

我要问一个非常基本的问题,但既然我遇到了这个问题,我不明白为什么会这样。通常当我们比较像 s1==s2 这样的两个字符串时,它会比较长度、字符、大小写等,但是在 linq 中使用以下查询时,它与字符串的大小写不匹配。我的数据库有密码 123,但是当我输入密码 123 时,它也会返回一个实际上是错误的记录。 我的查询是: var row = DB.tbllogin.Where(m => m.Id == LoginId && m.Password ==pwd.Trim()).FirstOrDefault();

情况不匹配。DB中的字段是nvarchar类型,pwd是字符串类型 我正在使用实体框架 ORM。

【问题讨论】:

标签: c# asp.net .net asp.net-mvc-3 c#-4.0


【解决方案1】:

问题是比较是在 SQL 中执行的——我怀疑如果你在 SQL Studio 中执行相同的查询,你会得到相同的结果。

一种解决方法是将数据库排序规则更改为区分大小写;目前尚不清楚您是否可以直接在 LINQ 本身中执行此操作。 (这是细节通过抽象泄漏的情况之一。)

但是,对于这种特定情况,更好的解决方案是不要以明文形式存储密码。这是非常不安全的。您应该使用bcrypt 之类的东西来存储哈希。详情请见Jeff Atwood's blog post on the topic

【讨论】:

  • StringComparison 不会工作。这也转换为不区分大小写的“=”。
  • @Jehof:很有趣。将删除该位,谢谢。 (由于“不要像这样存储密码”,我保留了答案,即使它主要是一个重复。)
  • 这至少对我在 LinqPad 中测试过的实体框架不起作用。我不确定提问者是否使用 EF,但我猜他使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 2012-06-04
相关资源
最近更新 更多