首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bcrypt的.Net实现,它实现了HashAlgorithm?

bcrypt的.Net实现,它实现了HashAlgorithm?
EN

Stack Overflow用户
提问于 2011-04-13 08:35:31
回答 1查看 2K关注 0票数 4

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-28 02:43:06

试试这个:

代码语言:javascript
复制
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);
    }
}

用法:

代码语言:javascript
复制
BCryptHasher hasher = new BCryptHasher();
string pw = "abc";
string hash = Encoding.UTF8.GetString(hasher.ComputeHash(Encoding.UTF8.GetBytes(pw)));

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

代码语言:javascript
复制
bool matches = hasher.Verify(pw, hash);

我添加了一些额外的属性,这样你就可以在散列之前传入一个预先计算的盐或一个功因子来生成一个新的盐:

代码语言:javascript
复制
string pw = "abc";
hasher.Salt = "$2a$06$If6bvum7DFjUnE9p2uDeDu";
string hash = Encoding.UTF8.GetString(hasher.ComputeHash(Encoding.UTF8.GetBytes(pw)));

我用"$2a$06$If6bvum7DFjUnE9p2uDeDu“的BCrypt测试用例"abc”尝试了一下,得到了正确的散列。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5643187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档