使用SHA256哈希校验登录时遇浮点数超8字节范围错误的解决咨询
解决SHA256哈希密码校验时的浮点数值超出范围错误
在使用SHA256哈希密码后,与数据库校验登录信息时出现错误:'浮点数值'5E884898'超出计算机(8字节)表示范围',以下是问题原因和解决方法:
问题原因
直接拼接SQL语句时,未给字符串类型的userName和userPassword添加单引号,数据库会将哈希值中类似5E884898的片段识别为科学计数法表示的浮点数,而该数值超出了8字节浮点数的存储范围,触发报错。同时这种拼接方式还存在严重的SQL注入风险。
解决方法
使用参数化查询替代字符串拼接,既可以解决浮点数识别问题,也能彻底避免SQL注入。同时修正代码中读取字段的逻辑错误(原代码查询userPassword却读取userName字段)。
修正后的代码
static string hashPassword(String password) { string hashedResult = ""; using (SHA256 sha256 = SHA256.Create()) { byte[] hashedValue = sha256.ComputeHash(Encoding.UTF8.GetBytes(password)); foreach (byte h in hashedValue) { hashedResult += $"{h:X2}"; } } return hashedResult; } bool loginCheck(string userLogin, string hashedPassword) { // 使用using管理连接生命周期,自动释放资源 using (SqlConnection connection = new SqlConnection("你的数据库连接字符串")) { connection.Open(); // 参数化SQL语句,避免字符串拼接引发的类型识别问题 string loginCheck = "SELECT 1 FROM logins WHERE userName = @userName AND userPassword = @userPassword"; using (SqlCommand loginChecker = new SqlCommand(loginCheck, connection)) { // 明确指定参数类型与长度,确保数据库正确识别为字符串 loginChecker.Parameters.Add("@userName", SqlDbType.VarChar, 255).Value = userLogin; loginChecker.Parameters.Add("@userPassword", SqlDbType.VarChar, 255).Value = hashedPassword; // 用ExecuteScalar直接判断是否存在匹配记录,提升查询效率 object result = loginChecker.ExecuteScalar(); return result != null; } } }
补充说明
- 原代码中查询字段与读取字段不匹配的逻辑错误已修正,改用
ExecuteScalar只需判断是否存在结果,无需遍历读取数据。 - 你的SQL表结构设计符合需求:
CREATE TABLE logins ( loginID INT PRIMARY KEY IDENTITY (1,1), userName varchar(255), userPassword varchar(255), priorityLevel int )
SHA256哈希后的字符串固定为64位长度,varchar(255)完全满足存储需求。
内容的提问来源于stack exchange,提问作者Charlie Gale
相关产品推荐
相关产品推荐

