【问题标题】:Return actual string value from LINQ SQLite query C#从 LINQ SQLite 查询 C# 返回实际字符​​串值
【发布时间】:2018-10-26 17:20:29
【问题描述】:

我目前正在使用 SQLite 在 Xamarin.ios 上使用 C# 创建登录系统。我遇到的问题是将散列密码发送到数据库,它工作正常。在它的登录方面,我需要取回实际的散列值,以便我可以运行一个方法来检查返回的值与用户输入的值。

我遇到的问题是查询实际上并没有返回一个值,我实际上并不了解我从查询中得到了什么。我运行 FirstOrDefault 以确保我只取回用户为其电子邮件输入的电子邮件和密码。但是,因为我没有得到一个字符串值,我不确定如何将它放入一个检查哈希值的方法中。

希望这是有道理的。这是运行查询的代码:

public void UserLogin()
    {
        string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "PmApp.db3");
        var connection = new SQLiteConnection(dbPath);


        string loginEmail = loginEmailInput.Text;
        string loginPass = loginPasswordInput.Text;

        var emailExists = (from s in connection.Table<SQLiteTables.LoginInfo>()
                           where s.Email.Equals(loginEmail)
                           where s.Password.Equals(loginPass)
                           select s).FirstOrDefault();


        Console.WriteLine(emailExists); //This is just to see what value gets returned
    }

这是返回的值:

2018-05-16 15:57:50.401 SQLite[15735:8043670] SQLite.SQLiteTables+LoginInfo

希望有人可以提供帮助。 杰米

【问题讨论】:

  • 这是一行。看看它的属性。
  • 密码是存储为散列值还是明文值?
  • 你得到的是一组数据,而不是一个字符串。正如@SLaks 所说,你应该检查你的变量
  • @Jason 它存储为哈希值,我想要整行但想查看每一行的实际值,以便我可以使用一种方法将返回的哈希值与用户输入的值进行比较价值

标签: c# ios sqlite xamarin.ios


【解决方案1】:
var loginInfo = (from s in connection.Table<SQLiteTables.LoginInfo>()
                       where s.Email.Equals(loginEmail)
                       select s).FirstOrDefault();

if (loginInfo != null) {
  var dbPass = loginInfo.Password;
  if (hash(dbPass) == hash(loginPass) {
    // hashed passwords match
  }
}

你也可以先做哈希

var hashedPass = hash(loginPass);
var loginInfo = (from s in connection.Table<SQLiteTables.LoginInfo>()
                       where s.Email.Equals(loginEmail)
                       where s.Password.Equals(hashedPass)
                       select s).FirstOrDefault();

if (loginInfo != null) {
  // hashed passwords match
}

【讨论】:

  • 第一个示例将双重哈希数据库密码,仅供参考。
【解决方案2】:

如果你只需要返回一列,试试这个:

var emailExists = (from s in connection.Table<SQLiteTables.LoginInfo>()
                       where s.Email.Equals(loginEmail)
                       where s.Password.Equals(loginPass)
                       select s.Email).FirstOrDefault();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多