BCrypt 盐:无效的盐长度

BCrypt Salt: Invalid Salt Length

我在安全领域的冒险之旅缓慢推进,但我遇到了另一个障碍,我无法完全理解。基本上,我正在努力使 Android 应用程序上的登录系统尽可能安全。我打算尽快使用 SSL,但我想涵盖所有场景(例如 cookie 劫持),因此我不希望用户以纯文本形式发送密码。我知道 SSL 会解决这个问题,但为什么不锁上您的前门并将您的护照妥善保管。

无论如何,我正在做的是在 SQL 数据库中为每个用户存储一个唯一的盐,在尝试登录时检索它,用这个盐散列用户密码并在服务器上进行交叉检查。

我遇到的问题是我的独特盐是在 PHP 中使用代码

创建的
$salt = base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM));

然后我附加“$2a$10$”并将 $salt 的长度减少到 22 个字符以匹配 BCrypt.gensalt() 输出。比如两次salt计算可以return

$salt            = a$TGnr99x6uS2TexsSl0Xw==
BCrypt.gensalt() = a$hGSvqpfbuG4Y7JbSTZaV..

当我将 hashpw 与 gensalt() 一起使用时,哈希工作正常。但是,当我使用我的独特盐时,我收到一个因盐长度无效而引发的错误:

10-04 22:25:41.262    9093-9093/com.example.version02 E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.version02, PID: 9093
    java.lang.IllegalArgumentException: Bad salt length
        at org.mindrot.jbcrypt.BCrypt.crypt_raw(BCrypt.java:622)
        at org.mindrot.jbcrypt.BCrypt.hashpw(BCrypt.java:692)
        at com.example.version02.Login.onClick(Login.java:90)
        at android.view.View.performClick(View.java:5156)
        at android.view.View$PerformClick.run(View.java:20755)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:5832)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

谁能看出我做错了什么?是不是很简单,我最终会戳自己的眼睛?

解决了这个问题,在偶然发现一个非常合适的网站 #9 http://blog.ircmaxell.com/2012/12/seven-ways-to-screw-up-bcrypt.html) 我发现我的盐没有被正确编码,我使用了他们建议的 $userSalt = substr(strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.'), 0, 22); 方法,它与 BCrypt 配合得很好haspw。感谢任何花时间为我检查此问题的人,对于浪费任何人的时间表示歉意。