使用我自己的gensalt() - 安全性如何?

2 投票
1 回答
1339 浏览
提问于 2025-04-17 07:59

bcrypt的工作原理是这样的:

>>> myhash = bcrypt.hashpw('testpassword', bcrypt.gensalt(12))
>>> myhash    
'$2a$12$K1hnCm5z74QtXaynv4.S8.i1FK9xjRr7JSPCRCyB9zpv8xZznZGFi'
>>> bcrypt.hashpw('testpassword', myhash)
'$2a$12$K1hnCm5z74QtXaynv4.S8.i1FK9xjRr7JSPCRCyB9zpv8xZznZGFi'

我想用它来做用户认证。问题是我想在客户端生成这个东西,所以我需要在客户端处理盐值部分。

我在想,如果我用自己的gensalt(username)——这个函数是根据用户名生成盐值——这样客户端每次都用同一个盐值,而这个盐值又和其他用户的不一样,可能会比较好。

这样做是否能接近bcrypt的效果,适合我的项目,还是说我在破坏bcrypt的安全性呢?

我在考虑,如果有人想破解密码,使用彩虹表(一种破解密码的工具)是不可能的,因为他必须为每个用户准备一个表。我对安全问题不是很有经验,不知道这样做是否合适。也许hashpw的速度足够快,能让人在电脑上进行暴力破解。

1 个回答

1

简单来说:,你所描述的并不安全。

首先,bcrypt并不是一种加密函数,所以它的结果是无法“解密”的。bcrypt是一种使用Blowfish算法的消息摘要函数。通过这种函数生成的哈希值是可以被破解的。

用消息摘要函数来进行客户端认证是非常有问题的。微软的NTLM就是使用这种函数来认证的,但它已经被破解过很多次。我认为这种认证方式有缺陷,应该避免使用。

使用消息摘要函数的原因是为了在安全中增加一层防护。如果攻击者能够找到SQL注入漏洞,你希望他们在登录之前需要花费资源去破解哈希值。如果我能从数据库中提取哈希值,并用它来登录,那么你的系统就完全没有价值了。重放攻击是客户端用哈希认证时的一个大问题。如果我能监听网络并重放登录序列,那么这个系统就毫无意义了。

生成一个随机的盐值,bcrypt.gensalt(12)应该就可以了。将哈希值和盐值存储在你的数据库中。你必须使用安全的传输层进行认证。确保你阅读一下owasp a9

撰写回答