【问题标题】:.Net implementation of bcrypt, which implements HashAlgorithm?bcrypt的.Net实现,它实现了HashAlgorithm?
【发布时间】:2011-04-13 00:35:30
【问题描述】:

我希望在我的身份验证库中允许 bcrypt 支持。现在的问题之一是我假设哈希器的类型为HashAlgorithm。 Bcrypt.net 没有实现这个类。此外,它是密封的,所以我必须制作自己的分支并自己修改它。有没有更好的替代方案已经实现了 HashAlgorithm?

【问题讨论】:

    标签: .net hash bcrypt password-hash bcrypt.net


    【解决方案1】:

    试试这个:

    public class BCryptHasher : HashAlgorithm
    {
        private MemoryStream passwordStream = null;
    
        protected override void HashCore(byte[] array, int ibStart, int cbSize)
        {
            if (passwordStream == null || Salt == null)
                Initialize();
    
            passwordStream.Write(array, ibStart, cbSize);
        }
    
        protected override byte[] HashFinal()
        {
            passwordStream.Flush();
    
            // Get the hash
            return Encoding.UTF8.GetBytes(BCrypt.Net.BCrypt.HashPassword(Encoding.UTF8.GetString(passwordStream.ToArray()), Salt));            
        }
    
        public override void Initialize()
        {
            passwordStream = new MemoryStream();
    
            // Set up salt
            if (Salt == null)
            {
                if (WorkFactor == 0)
                    Salt = BCrypt.Net.BCrypt.GenerateSalt();
                else
                    Salt = BCrypt.Net.BCrypt.GenerateSalt(WorkFactor);
            }
        }
    
        public int WorkFactor { get; set; }
    
        public string Salt { get; set; }
    
        public bool Verify(string plain, string hash)
        {
            return BCrypt.Net.BCrypt.Verify(plain, hash);
        }
    }
    

    用法:

    BCryptHasher hasher = new BCryptHasher();
    string pw = "abc";
    string hash = Encoding.UTF8.GetString(hasher.ComputeHash(Encoding.UTF8.GetBytes(pw)));
    

    此外,我添加了一个辅助验证方法,以便您可以验证密码和哈希是否匹配,但如果您只调用默认的 BCrypt.Verify,则可以消除这种情况。

    bool matches = hasher.Verify(pw, hash);
    

    我添加了一些额外的属性,以便您可以在进行哈希之前传入预先计算的盐或工作因子以生成新盐:

    string pw = "abc";
    hasher.Salt = "$2a$06$If6bvum7DFjUnE9p2uDeDu";
    string hash = Encoding.UTF8.GetString(hasher.ComputeHash(Encoding.UTF8.GetBytes(pw)));
    

    我尝试了 BCrypt 测试用例“abc”,盐为“$2a$06$If6bvum7DFjUnE9p2uDeDu”,得到了正确的哈希值。

    【讨论】:

    • 这看起来很完美。今晚我会试试,如果一切顺利,那么你真的帮了我一个大忙
    • 致未来的观众:请注意,这与 HashAlgorithm 并不“传统上”兼容。由于 BCrypt 的工作原理,它具有我所说的“跟踪盐”。您不能只将盐添加到散列密码或类似的东西中,您必须以纯文本(或加密)的形式将盐显式存储在某处,以便为密码获得相同的散列。
    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 2021-01-11
    • 2014-11-20
    • 2020-03-23
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多