2013-08-02 28 views
0

我有一個數據庫的列(密碼)數據類型之一是二進制(60)。如何比較MySQL中的二進制與JAVA

我在java中使用密碼作爲STRING,並嘗試將來自java(來自用戶界面)的密碼與MySQL中的密碼(如二進制)進行比較。

但它從來沒有給我任何結果..

請指導什麼數據類型/值將能夠與二進制類型

感謝

+0

爲什麼您將密碼存儲爲二進制類型? – christopher

+0

這就是我在想什麼,因爲我不使用數據庫,我只是一個開發人員,我剛從數據庫開發人員那裏得到這個數據庫..我不推薦這麼做嗎? – junaidp

回答

0

將數據庫字段配置爲二進制字符串可能並不理想,但也不是問題。

問題但是,您打算直接在那裏存儲密碼。請不要這樣做,因爲它會造成一個重大的安全漏洞。

散列它作爲建議在另一個答案是更好的,但仍然不是很好。問題在於,有所謂的彩虹表可以使用反向查找哈希來達到原始值。

您需要做的最低限度是使用salted散列(https://en.wikipedia.org/wiki/Salt_(cryptography))或甚至更好,使用類似bcrypt或PBKDF2(請參閱Password Verification with PBKDF2 in Java)創建用戶提供的密碼的安全散列。這些哈希將具有固定的長度,並且可以很容易地將其作爲二進制字符串存儲在給定的數據庫字段中。

檢查用戶條目時,只需再次執行相同的功能並將其與數據庫內容進行比較。當然,您必須使用SSL將密碼從客戶端傳輸到服務器。

0

我很困惑,爲什麼你」比較已經使用的二進制類型,但你可以嘗試:

String password = "a password"; 
// Run password through cryptographic functions. 
String binaryStr = ""; 

for(char c : password) 
{ 
    int charInt = (int)c; 
    // Convert the character to it's integer representation. 
    binaryStr += Integer.toBinaryString(charInt); 
    // Convert that integer into a binary string. 
} 

的BINARY和VARBINARY類型類似於CHAR和VARCHAR,除了它們包含二進制字符串而非非二進制字符串。

按照文檔,您可以簡單地將您生成的新的二進制值與表中的值進行比較。但是,請記住,這是存儲密碼的一種非常奇怪的方式,只是存儲消息摘要(假設以二進制形式存儲它提供了0個額外的安全性)就更有意義。

0

您應該將您的字段設置爲PASSWORD而不是MySQL。就像這樣,只要將密碼保存在數據庫中,密碼就會在MD5中散列。要在用戶登錄時進行比較,只需將用戶給定的密碼散列到MD5中,並對存儲在數據庫中的密碼進行字符串比較。

+0

請注意,MD5是** NOT **加密,但僅僅是一個散列函數。加密意味着涉及某種密鑰,並且只要您擁有該密鑰,就可以回到原始數據。 –

+0

密碼的MD5是一個壞主意,因爲它已被破壞。而且,至少應該醃製價值。更好的是,如果您必須使用安全散列(SHA-2,SHA-128,SHA-256),但最好使用密碼 - 使用類似bcrypt或PBKDF2的密碼。看到我的答案。 –