2015-10-04 110 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