feat: add login
This commit is contained in:
140
全自动水压检测仪/DATA/PasswordHelper.cs
Normal file
140
全自动水压检测仪/DATA/PasswordHelper.cs
Normal file
@@ -0,0 +1,140 @@
|
||||
using System;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
|
||||
namespace 全自动水压检测仪.DATA
|
||||
{
|
||||
/// <summary>
|
||||
/// 密码加密辅助类
|
||||
/// 使用 SHA256 + 盐值加密
|
||||
/// 精确简单的实现,确保100%匹配
|
||||
/// </summary>
|
||||
public static class PasswordHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// 生成随机盐值(16字节)
|
||||
/// </summary>
|
||||
/// <returns>Base64编码的盐值字符串</returns>
|
||||
public static string GenerateSalt()
|
||||
{
|
||||
byte[] saltBytes = new byte[16];
|
||||
using (var rng = new RNGCryptoServiceProvider())
|
||||
{
|
||||
rng.GetBytes(saltBytes);
|
||||
}
|
||||
return Convert.ToBase64String(saltBytes);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用 SHA256 哈希密码
|
||||
/// 精确实现:密码 + 盐值 -> SHA256 -> Base64
|
||||
/// </summary>
|
||||
/// <param name="password">明文密码</param>
|
||||
/// <param name="salt">盐值</param>
|
||||
/// <returns>Base64编码的密码哈希值</returns>
|
||||
public static string HashPassword(string password, string salt)
|
||||
{
|
||||
if (string.IsNullOrEmpty(password))
|
||||
throw new ArgumentNullException(nameof(password));
|
||||
|
||||
if (string.IsNullOrEmpty(salt))
|
||||
throw new ArgumentNullException(nameof(salt));
|
||||
|
||||
// 拼接密码和盐值
|
||||
string combined = password + salt;
|
||||
|
||||
// 转换为字节数组
|
||||
byte[] combinedBytes = Encoding.UTF8.GetBytes(combined);
|
||||
|
||||
// 计算 SHA256 哈希
|
||||
using (var sha256 = SHA256.Create())
|
||||
{
|
||||
byte[] hashBytes = sha256.ComputeHash(combinedBytes);
|
||||
|
||||
// 转换为 Base64 字符串
|
||||
string hash = Convert.ToBase64String(hashBytes);
|
||||
|
||||
return hash;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 验证密码是否匹配
|
||||
/// 精确实现:重新计算哈希并比较
|
||||
/// </summary>
|
||||
/// <param name="inputPassword">输入的明文密码</param>
|
||||
/// <param name="storedHash">存储的密码哈希值</param>
|
||||
/// <param name="salt">盐值</param>
|
||||
/// <returns>密码是否匹配</returns>
|
||||
public static bool VerifyPassword(string inputPassword, string storedHash, string salt)
|
||||
{
|
||||
if (string.IsNullOrEmpty(inputPassword))
|
||||
return false;
|
||||
|
||||
if (string.IsNullOrEmpty(storedHash))
|
||||
return false;
|
||||
|
||||
if (string.IsNullOrEmpty(salt))
|
||||
return false;
|
||||
|
||||
try
|
||||
{
|
||||
// 使用相同的方法计算输入密码的哈希
|
||||
string inputHash = HashPassword(inputPassword, salt);
|
||||
|
||||
// 精确比较(区分大小写)
|
||||
bool isMatch = string.Equals(inputHash, storedHash, StringComparison.Ordinal);
|
||||
|
||||
// 调试输出
|
||||
System.Diagnostics.Debug.WriteLine($"[密码验证]");
|
||||
System.Diagnostics.Debug.WriteLine($" 输入密码: {inputPassword}");
|
||||
System.Diagnostics.Debug.WriteLine($" 盐值: {salt}");
|
||||
System.Diagnostics.Debug.WriteLine($" 计算的哈希: {inputHash}");
|
||||
System.Diagnostics.Debug.WriteLine($" 存储的哈希: {storedHash}");
|
||||
System.Diagnostics.Debug.WriteLine($" 是否匹配: {isMatch}");
|
||||
|
||||
return isMatch;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine($"[密码验证异常] {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 测试密码加密功能
|
||||
/// </summary>
|
||||
public static void TestPasswordEncryption()
|
||||
{
|
||||
System.Diagnostics.Debug.WriteLine("=== 测试密码加密功能 ===");
|
||||
|
||||
// 测试 1: admin123
|
||||
string salt1 = GenerateSalt();
|
||||
string hash1 = HashPassword("admin123", salt1);
|
||||
bool verify1 = VerifyPassword("admin123", hash1, salt1);
|
||||
|
||||
System.Diagnostics.Debug.WriteLine($"\n测试 1: admin123");
|
||||
System.Diagnostics.Debug.WriteLine($" 盐值: {salt1}");
|
||||
System.Diagnostics.Debug.WriteLine($" 哈希: {hash1}");
|
||||
System.Diagnostics.Debug.WriteLine($" 验证: {verify1} (应该为 True)");
|
||||
|
||||
// 测试 2: 123
|
||||
string salt2 = GenerateSalt();
|
||||
string hash2 = HashPassword("123", salt2);
|
||||
bool verify2 = VerifyPassword("123", hash2, salt2);
|
||||
|
||||
System.Diagnostics.Debug.WriteLine($"\n测试 2: 123");
|
||||
System.Diagnostics.Debug.WriteLine($" 盐值: {salt2}");
|
||||
System.Diagnostics.Debug.WriteLine($" 哈希: {hash2}");
|
||||
System.Diagnostics.Debug.WriteLine($" 验证: {verify2} (应该为 True)");
|
||||
|
||||
// 测试 3: 错误密码
|
||||
bool verify3 = VerifyPassword("wrongpassword", hash1, salt1);
|
||||
System.Diagnostics.Debug.WriteLine($"\n测试 3: 错误密码");
|
||||
System.Diagnostics.Debug.WriteLine($" 验证: {verify3} (应该为 False)");
|
||||
|
||||
System.Diagnostics.Debug.WriteLine("\n=== 测试完成 ===\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user