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

Posted

技术标签:

【中文标题】在 Android 应用程序中使用 jBCrypt 对密码进行加盐会导致长时间挂起【英文标题】:Using jBCrypt to salt passwords in Android App causes a long hang 【发布时间】:2011-11-29 10:14:29 【问题描述】:

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

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

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

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

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

【问题讨论】:

嗯,在某种程度上,bcrypt 就是为了做到这一点而设计的。当然,如果它在客户端造成如此长时间的挂起,那是不可接受的。 您尝试在 UI 之外的另一个线程上运行散列过程? (例如:android.os.AsyncTask) 【参考方案1】:

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

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

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

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

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

【讨论】:

从客户端向服务器发送密码的哈希和以明文形式发送密码的区别在于,如果它被截获,它只对那个域有效。跨域妥协(人们在多个站点上重复使用相同的密码)非常普遍。 @StevePomeroy BCrypt 使用随机盐,因此实际上您无法检查密码,除非它以明文形式存储在服务器上,或者您在计算哈希之前将盐发送给客户端。如果您使用 HTTPS 之类的安全通道(您始终应该这样做),那么在防止传输中的拦截方面您不会获得太多收益。共享密码泄露通常是由于密码数据库被盗并使用纯文本或使用错误的算法进行散列的结果。

以上是关于在 Android 应用程序中使用 jBCrypt 对密码进行加盐会导致长时间挂起的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins重置密码

Centos6.8部署jenkins2.46.2

Jenkins忘记密码

jenkins 管理员密码重置

如何在 android 应用程序中使用 OSM 地图。?有啥教程可以学习在android中使用OSM吗?

我可以在 sencha 应用程序(Android)中使用 android AsyncTask