网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
namespace Dpz.Core.Service.RepositoryServiceImpl;

/// <summary>
/// 密码哈希服务实现
/// 使用BCrypt作为新版本密码哈希算法,同时兼容旧版本MD5密码
/// </summary>
public class PasswordHashService : IPasswordHashService
{
    private const int DefaultWorkFactor = 12;

    /// <summary>
    /// 使用BCrypt对密码进行哈希(新版本)
    /// </summary>
    /// <param name="password">原始密码</param>
    /// <param name="workFactor">工作因子(默认12)</param>
    /// <returns>BCrypt哈希字符串</returns>
    public string HashPasswordBCrypt(string password, int workFactor = DefaultWorkFactor)
    {
        if (string.IsNullOrWhiteSpace(password))
        {
            throw new ArgumentException("密码不能为空", nameof(password));
        }

        if (workFactor is < 4 or > 31)
        {
            throw new ArgumentException("工作因子必须在4-31之间", nameof(workFactor));
        }
        return BCrypt.Net.BCrypt.HashPassword(password, workFactor);
    }

    /// <summary>
    /// 使用MD5对密码进行哈希(旧版本兼容)
    /// </summary>
    /// <param name="account">用户账号</param>
    /// <param name="password">原始密码</param>
    /// <returns>MD5哈希后的密码</returns>
    public string HashPasswordMD5(string account, string password)
    {
        if (string.IsNullOrWhiteSpace(account))
        {
            throw new ArgumentException("账号不能为空", nameof(account));
        }
        if (string.IsNullOrWhiteSpace(password))
        {
            throw new ArgumentException("密码不能为空", nameof(password));
        }

        var combinedString = account + password;
        return combinedString.GenerateMd5();
    }

    /// <summary>
    /// 验证BCrypt密码(新版本)
    /// </summary>
    /// <param name="password">输入的密码</param>
    /// <param name="hashedPassword">存储的BCrypt哈希</param>
    /// <returns>密码是否正确</returns>
    public bool VerifyPasswordBCrypt(string password, string hashedPassword)
    {
        if (string.IsNullOrWhiteSpace(password) || string.IsNullOrWhiteSpace(hashedPassword))
        {
            return false;
        }

        try
        {
            return BCrypt.Net.BCrypt.Verify(password, hashedPassword);
        }
        catch
        {
            return false;
        }
    }

    /// <summary>
    /// 验证MD5密码(旧版本兼容)
    /// </summary>
    /// <param name="account">用户账号</param>
    /// <param name="password">输入的密码</param>
    /// <param name="storedHash">存储的MD5哈希</param>
    /// <returns>密码是否正确</returns>
    public bool VerifyPasswordMD5(string account, string password, string storedHash)
    {
        if (
            string.IsNullOrWhiteSpace(account)
            || string.IsNullOrWhiteSpace(password)
            || string.IsNullOrWhiteSpace(storedHash)
        )
        {
            return false;
        }

        var expectedHash = HashPasswordMD5(account, password);
        return expectedHash.Equals(storedHash, StringComparison.Ordinal);
    }

    /// <summary>
    /// 智能验证密码(自动识别BCrypt或MD5)
    /// </summary>
    /// <param name="account">用户账号</param>
    /// <param name="password">输入的密码</param>
    /// <param name="storedHash">存储的密码哈希</param>
    /// <returns>密码是否正确</returns>
    public bool VerifyPassword(string account, string password, string storedHash)
    {
        if (string.IsNullOrWhiteSpace(password) || string.IsNullOrWhiteSpace(storedHash))
        {
            return false;
        }

        // 如果是BCrypt格式,使用BCrypt验证
        if (IsBCryptHash(storedHash))
        {
            return VerifyPasswordBCrypt(password, storedHash);
        }

        // 否则使用MD5验证(兼容旧版本)
        return VerifyPasswordMD5(account, password, storedHash);
    }

    /// <summary>
    /// 生成新版本密码哈希(BCrypt)
    /// </summary>
    /// <param name="password">原始密码</param>
    /// <returns>BCrypt哈希字符串</returns>
    public string CreatePasswordHash(string password)
    {
        return HashPasswordBCrypt(password);
    }

    /// <summary>
    /// 检查密码哈希是否为BCrypt格式(新版本)
    /// </summary>
    /// <param name="hashedPassword">密码哈希</param>
    /// <returns>是否为BCrypt格式</returns>
    public bool IsBCryptHash(string? hashedPassword)
    {
        if (string.IsNullOrWhiteSpace(hashedPassword))
        {
            return false;
        }

        // BCrypt哈希格式:$2a$, $2b$, $2x$, $2y$ 开头
        return hashedPassword.StartsWith("$2a$")
            || hashedPassword.StartsWith("$2b$")
            || hashedPassword.StartsWith("$2x$")
            || hashedPassword.StartsWith("$2y$");
    }

    /// <summary>
    /// 检查密码是否使用了新版本算法(BCrypt)
    /// </summary>
    /// <param name="hashedPassword">密码哈希</param>
    /// <returns>是否为新版本密码</returns>
    public bool IsNewVersionPassword(string? hashedPassword)
    {
        return IsBCryptHash(hashedPassword);
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码实现了一个密码哈希服务,主要用于处理用户密码的哈希和验证。它使用了两种密码哈希算法:BCrypt(新版本)和MD5(旧版本),以便兼容旧系统。以下是代码的主要功能和结构的详细解释:

1. 类和接口

  • PasswordHashService: 这是实现了 IPasswordHashService 接口的类,负责密码的哈希和验证。
  • IPasswordHashService: 该接口的具体实现未在代码中提供,但可以推测它定义了与密码哈希相关的方法。

2. 常量

  • DefaultWorkFactor: 这是BCrypt算法的默认工作因子,值为12。工作因子决定了哈希计算的复杂度,值越高,计算越耗时,安全性越高。

3. 哈希密码的方法

  • HashPasswordBCrypt: 使用BCrypt算法对输入的密码进行哈希。它接受一个密码和一个可选的工作因子,确保密码不为空且工作因子在4到31之间。
  • HashPasswordMD5: 使用MD5算法对输入的账号和密码进行哈希。它将账号和密码组合后生成MD5哈希,确保账号和密码不为空。

4. 验证密码的方法

  • VerifyPasswordBCrypt: 验证输入的密码是否与存储的BCrypt哈希匹配。它会捕获任何异常并返回false,以确保安全性。
  • VerifyPasswordMD5: 验证输入的密码是否与存储的MD5哈希匹配。它首先生成输入密码的MD5哈希,然后与存储的哈希进行比较。

5. 智能验证密码

  • VerifyPassword: 这是一个智能验证方法,根据存储的哈希格式自动选择使用BCrypt或MD5进行验证。它首先检查存储的哈希是否为BCrypt格式,然后调用相应的验证方法。

6. 创建新版本密码哈希

  • CreatePasswordHash: 直接调用 HashPasswordBCrypt 方法来生成BCrypt哈希。

7. 检查哈希格式的方法

  • IsBCryptHash: 检查给定的哈希字符串是否为BCrypt格式。BCrypt哈希通常以 $2a$, $2b$, $2x$, 或 $2y$ 开头。
  • IsNewVersionPassword: 检查给定的哈希是否使用了新版本的算法(即BCrypt)。

总结

这个 PasswordHashService 类提供了一种安全的方式来处理用户密码的存储和验证。它通过支持BCrypt和MD5两种算法,确保了对旧系统的兼容性,同时也利用BCrypt的安全性来保护新用户的密码。通过智能验证方法,用户可以无缝地在新旧哈希之间进行转换。

loading