我在使用我的应用注册时使用jBCrypt Library哈希用户密码。
我正在使用基本哈希函数,使用盐,如下所示:
String pass = BCrypt.hashpw(rawPass, BCrypt.gensalt());
注册时注意到一到两分钟挂起,并检查调试器,确认BCrypt负责。
密码密码真的需要 强大的处理能力吗?如果是这样,一个好的选择是将明文密码发送到服务器来散列它吗?我最初的想法就是在它发送到任何地方之前将其哈希。有什么想法吗?
答案 0 :(得分:11)
以下是an article,其中列出了使用Core 2 Duo处理器的Mac笔记本电脑所用的时间。所以,是的,Bcrypt可能在移动设备上非常慢。
另一个常见问题是SecureRandom
的初始化可能非常慢,并且由于缺少足够的随机数据而可能也会挂起。这将因不同的机器和操作系统而异。你可以在其他地方找到很多关于它的讨论,但是你可能想要测试它是使用new SecureRandom()
自己初始化它还是分别调用gensalt
以隔离随机数据生成然后调用时间到hashpw
。
另一个问题是为什么你真的想在客户端上哈希呢?如果您将它存储在客户端并在本地登录,那么这可能有一定意义,但如果它被发送到服务器并且正常登录涉及向服务器发送明文密码,那么您没有获得任何东西。另外,一个常见的误解是在将密码发送到服务器(登录时)提供密码时提供一些保护,实际上它相当于发送明文密码。攻击者只能获取哈希才能获得访问权。
如果密码存储本身受到威胁,散列密码是一种防止攻击者获取访问权限(或至少减慢速度)的方法。
因此,如果密码存储在服务器上,则应以明文(通过安全通道)发送,服务器应决定如何进行哈希处理。