2016-06-11 55 views
-2

我目前正在進行一個學校項目,部分任務是啓用用戶登錄。因此,我認爲使用簡單的base64編碼並將其轉換爲小寫字母將是非常好的加密方法,因爲base64通常由高位字符和低位字符組成。這裏是一個代表性的代碼:Base64編碼與小寫字母轉換密碼的安全性如何?

set @passwd = 'Password'; 
set @salt = 'Salt'; 
set @email = '[email protected]'; 

INSERT INTO `db_scrumboardtable`.`tb_user` (`mail`, `password`, `nameToDisplay`) VALUES (@email, LOWER(to_base64(sha2(concat(@passwd,@salt),512))) , 'test'); 

select u.tb_User_id from `db_scrumboardtable`.`tb_user` u where u.mail = @email and u.password = LOWER(to_base64(sha2(concat(@passwd,@salt),512))); 
+0

你的問題是什麼? – hagello

+0

Base64可以被任何人撤消。你也可以用純文本存儲它。 –

+1

除了下面指出的重要問題外,正確的用法是'TO_BASE64(UNHEX(SHA2(...)))'。 MySQL中的哈希函數返回它們的十六進制編碼的值,這需要被撤消,否則你有很多浪費的位(實際上等於4:8),因爲你提供的字節數是實際需要的兩倍傳達信息,因此只有每個字節(6個可能的,因爲有64個符號)的3個比特的Base64結果是有意義的。這將進一步簡化逆轉你的「算法」,因爲根據定義,240/256個可能的輸入無效。 –

回答

7

它不安全,它不是加密。

如果您將所有base64編碼的字符更改爲小寫,您將失去獲取原始值(「解密」)的能力。由於密碼不應該加密,但散列,這並不是很糟糕。

現在,考慮爲什麼要對密碼進行哈希處理,通常的攻擊場景是,攻擊者成功地設法竊取散列密碼列表,但爲了獲取這些密碼,他們需要強制輸入以找到比賽。在這種情況下,他們可以簡單地解碼「加密」密碼並獲得有效密碼。當然,這個密碼的用處有限,因爲它可以用來登錄到它被盜的服務器,但不一定是用戶可能使用過相同密碼的其他服務。


密碼應與像PBKDF2,bcrypt,scrypt或Argon2高的成本因素或多次迭代方案進行適當散列。

2

這不是安全的。您的內射轉換(混合大小寫)使得密碼更易於猜測,而不是更難。

在21世紀充斥着網絡犯罪分子,請不要試圖發明自己的安全軟件。請閱讀這個。 http://php.net/manual/en/faq.passwords.php