在Android应用程序中使用jBCrypt加密密码会导致长时间挂起

Wil*_*all 8 java passwords android bcrypt jbcrypt

我在使用我的应用程序注册时使用jBCrypt库来哈希用户密码.

我正在使用基本哈希函数,使用salt,如下所示:

String pass = BCrypt.hashpw(rawPass, BCrypt.gensalt());
Run Code Online (Sandbox Code Playgroud)

我注意到在注册时一到两分钟,并检查了调试器,确认BCrypt负责.

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

Sha*_*eep 11

这里是一个物品,其中列出了Core 2双核处理器上的苹果笔记本电脑采取的倍.所以,是的,Bcrypt可能在移动设备上非常慢.

另一个常见问题是初始化SecureRandom可能非常慢并且由于缺少足够的随机数据而可能也会挂起.这将因不同的机器和操作系统而异.你可以在其他地方找到很多关于它的讨论,但是你可能想要测试它是自己初始化它new SecureRandom()还是通过gensalt单独调用来隔离随机数据生成然后只是调用时间hashpw.

另一个问题是为什么你真的想在客户端上哈希呢?如果您将它存储在客户端并在本地登录,那么这可能有一定意义,但如果它被发送到服务器并且正常登录涉及向服务器发送明文密码,那么您没有获得任何东西.另外,一个常见的误解是,在将密码发送到服务器(登录时)提供一些保护时,对密码进行哈希处理,实际上它相当于发送明文密码.攻击者只能获取哈希才能获得访问权限.

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

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

  • 从客户端向服务器发送密码哈希与以明文方式发送密码之间的区别在于,如果它被截获,则仅对该域有效.跨域妥协(由人们在多个站点上重复使用相同的密码)非常常见. (4认同)
  • @StevePomeroy BCrypt使用随机盐,所以在实践中你无法检查密码,除非它以明文形式存储在服务器上,或者在计算哈希值之前将盐发送到客户端.如果您使用像HTTPS这样的安全通道(您应该始终这样做),那么在防止传输中的拦截方面您就无法获得太多收益.共享密码泄露通常是由于密码数据库被盗而使用纯文本或使用较差的算法选择进行散列. (2认同)