随着我的冒险进入安全之地的慢慢进展,我又遇到了另一个路障,我无法理解。基本上我正试图让我的Android应用程序上的登录系统尽可能安全。我打算尽快使用SSL,但我想涵盖所有场景(例如cookie劫持),因此我不希望用户以纯文本形式发送密码。我知道SSL会处理这个,但为什么不锁上你的前门并把你的护照放在保险箱里。
无论如何,我正在做的是为SQL数据库中的每个用户存储一个唯一的salt,在登录尝试时检索它,用这个salt散列用户密码并在服务器上交叉检查。
我遇到的问题是我使用代码
在PHP中创建了我的唯一salt$salt = base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM));
然后我追加“$ 2a $ 10 $”并将$ salt的长度减少到22个字符以匹配BCrypt.gensalt()输出。例如,两个盐计算可以返回
$salt = $2a$10$TGnr99x6uS2TexsSl0Xw==
BCrypt.gensalt() = $2a$10$hGSvqpfbuG4Y7JbSTZaV..
当我使用带有gensalt()的hashpw时,哈希工作正常。但是,当我使用我的独特盐时,我会因无效盐长度而抛出错误:
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$1.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)
任何人都能看到我做错的事吗?是不是很简单,我最终还是会盯着自己?
答案 0 :(得分:1)
解决了它,在一个非常贴切的网站#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 {{ 1}}。感谢任何花时间为我检查这一点的人,并为浪费任何人的时间道歉。