2015-10-04 107 views
-3

与我冒险到安全之地进展缓慢,我已经打了又一个障碍,我不能完全围绕让我的头。基本上我试图让我的Android应用程序尽可能安全的登录系统。我打算尽快去SSL,但我想覆盖所有情况(如cookie劫持),因此我不希望用户以纯文本格式发送密码。我知道SSL会照顾到这一点,但为什么不锁定你的前门,并保持你的护照安全。BCrypt盐:盐无效长度

不管怎么说,我做的是存储在SQL数据库每个用户的唯一盐,检索这在登录尝试,散列这种盐的用户密码和交叉检查服务器上。

我遇到的问题是我的唯一盐在PHP中使用的代码

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

我再追加“$ 2A $ 10个$”,降低了$盐的长度为22个字符以匹配BCrypt.gensalt()输出。例如,这两个盐的计算可以返回

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

当我使用hashns与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$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) 

谁能明白我doign错了吗?是不是很简单,我最终会在自己的眼中戳一下?

回答

0

解决它,穿过一个非常贴切的网站#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的伟大工程磕磕绊绊之后。感谢任何花时间为我检查这件事情的人,并道歉浪费任何人的时间。

+0

@ Michu93你真的编辑'wasn't'到'是not'上一个帖子说的(哎呀我的意思是说'is')2岁了吗?你是否想为自己赢得新的徽章? – AranDG

+0

不,对获得徽章不感兴趣。编辑的代码,但我也需要6个字符来改变,这是人工的原因不是 - >不是 – Michu93