Xamarin.iOS中C# LINQ SQLite查询无法返回实际哈希密码字符串问题
解决Xamarin.iOS中SQLite登录查询返回对象而非哈希密码的问题
嘿Jamie,我明白你现在卡在哪了——你的查询返回的是整个LoginInfo实体对象,而不是你需要的哈希密码字段,所以控制台输出的是对象的类型名称,没法直接用来做密码校验。咱们一步步把这个问题理顺:
问题根源
你当前的LINQ查询select s是把匹配条件的完整LoginInfo实体取出来,FirstOrDefault()返回的是这个实体的实例。当你用Console.WriteLine(emailExists)时,默认调用了对象的ToString()方法,而默认实现就是输出类型的完整名称,也就是你看到的SQLite.SQLiteTables+LoginInfo。
另外,你的查询逻辑还有个小疏漏:你直接用用户输入的明文密码(loginPass)和数据库里的哈希密码做对比,这肯定不对——你应该先把用户输入的密码用和存储时相同的哈希算法处理,再和数据库里的哈希值对比。
修改后的代码示例
public void UserLogin() { string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "PmApp.db3"); // 使用using语句自动管理数据库连接的释放,避免资源泄漏 using (var connection = new SQLiteConnection(dbPath)) { string loginEmail = loginEmailInput.Text; string loginPass = loginPasswordInput.Text; // 第一步:根据邮箱查找对应的用户记录(只匹配邮箱,先不校验密码) var userRecord = connection.Table<SQLiteTables.LoginInfo>() .FirstOrDefault(s => s.Email.Equals(loginEmail, StringComparison.OrdinalIgnoreCase)); if (userRecord != null) { // 第二步:把用户输入的密码哈希处理(替换成你存储密码时用的哈希方法) string hashedInputPassword = HashPassword(loginPass); // 第三步:对比数据库中存储的哈希密码和输入密码的哈希值 if (userRecord.Password.Equals(hashedInputPassword)) { Console.WriteLine("登录成功!"); // 这里添加登录成功后的逻辑,比如跳转到主页面 } else { Console.WriteLine("密码错误,请重新输入!"); } } else { Console.WriteLine("该邮箱未注册!"); } } } // 示例哈希方法(替换成你实际使用的算法,比如BCrypt、SHA256等,注意如果用了盐要和存储时一致) private string HashPassword(string plainPassword) { // 这里只是示例,实际要使用安全的哈希算法,比如BCrypt.Net-Next using (var sha256 = System.Security.Cryptography.SHA256.Create()) { byte[] bytes = System.Text.Encoding.UTF8.GetBytes(plainPassword); byte[] hash = sha256.ComputeHash(bytes); return Convert.ToBase64String(hash); } }
关键要点说明
- 提取哈希密码:通过
userRecord.Password就能直接获取数据库中存储的哈希密码值,因为userRecord是LoginInfo的实例,包含了该用户的所有字段。 - 正确的密码校验流程:永远不要把明文密码直接和数据库中的哈希值对比,必须先对输入的密码做相同的哈希处理(如果存储时用了盐值,还要确保使用同一个盐值,最好是给每个用户单独存储盐值,比如给
LoginInfo加一个Salt字段)。 - 资源管理:用
using包裹SQLite连接,确保连接使用后自动关闭和释放,避免内存泄漏。 - 邮箱匹配优化:用
StringComparison.OrdinalIgnoreCase做邮箱的不区分大小写匹配,更符合用户的使用习惯。
内容的提问来源于stack exchange,提问作者Jamie Leech
相关产品推荐
相关产品推荐

