9

当他们使用我的应用程序注册时,我正在使用jBCrypt 库对用户密码进行哈希处理。

我正在使用带有盐的基本哈希函数,如下所示:

String pass = BCrypt.hashpw(rawPass, BCrypt.gensalt());

注册时我注意到一到两分钟的挂起,并检查了调试器,确认 BCrypt 负责。

加盐密码真的需要那么多处理能力吗?如果是这样,一个好的选择是将明文密码发送到服务器进行散列吗?我最初对此事的想法是在它被发送到任何地方之前对其进行哈希处理。有任何想法吗?

4

1 回答 1

11

这是一篇文章,列出了配备 Core 2 Duo 处理器的 Mac 笔记本电脑所用的时间。所以,是的,Bcrypt 在移动设备上可能会非常慢。

另一个常见的问题是初始化SecureRandom可能非常慢,并且也可能由于缺乏足够的随机数据而挂起。这在不同的机器和操作系统之间会有所不同。您会在其他地方找到很多关于此的讨论,但您可能希望自己使用初始化它new SecureRandom()或单独调用gensalt以隔离随机数据生成,然后只需对hashpw.

另一个问题是为什么你真的想在客户端上散列它?如果您将其存储在客户端并在本地登录,那么这可能是有道理的,但如果它被发送到服务器并且正常登录涉及向服务器发送明文密码,那么您将一无所获。此外,一个常见的误解是在将密码发送到服务器之前(登录时)对密码进行哈希处理可以提供一些保护,而实际上它等同于发送明文密码。攻击者只有获得哈希才能获得访问权限。

如果密码存储本身受到破坏,散列密码是一种防止攻击者获得访问权限(或至少减慢访问速度)的方法。

因此,如果密码存储在服务器上,它应该以明文(通过安全通道)发送,并且服务器应该决定如何对其进行哈希处理。

于 2011-12-13T11:58:15.953 回答