2011-01-06 81 views
2

我已經實現了我的郵件服務器作爲口述herePostfix + MySQL ENCRYPT(),它如何驗證隨機鹽的密碼?

它工作得很好。我的好奇心是圍繞着用戶進入到數據庫,並驗證它們

運行:

INSERT INTO users (email, password) VALUES ('[email protected]', ENCRYPT('password')); 

多次將給予不同的散列加密的密碼作爲其利用隨機鹽。即如果我輸入[email protected]三次使用相同的密碼,每個哈希是不同的...

我的問題是,它是如何當Postfix服務器可以實際驗證密碼,當用戶登錄通過郵件客戶端?

沒有任何問題可以說,因爲它工作正常,更多的是爲了滿足我的好奇心,所以我可以完全理解幕後發生的事情,以正確驗證加密的密碼。

回答

2

閱讀man crypt:它在返回值的前兩個字符中返回salt。

所以鹽不會丟失,您可以將加密的字符串與crypt('pass',$ first_two_chars_of_encrypted_value)的結果進行比較。

-3

您必須使用ENCRYPT('pass','salt')強制加鹽,否則鹽會永遠丟失,您無法恢復它。相當沒有它的沒有意義的功能。然而,這是一個可怕的功能,因爲安全性非常小。請改用PASSWORD()或OLD_PASSWORD()。 ()使用系統crypt(),它可以使用全部或只使用前8個字符,必須是可打印的7位ascii,通常使用1輪基於DES的散列,並且是完全不可移植的。躲開它。

+1

如果鹽是永遠失去了,那麼他的配置將不實際工作。我同意加密聽起來不是一個好的解決方案,但是有沒有辦法讓postfix接受別的東西? – Dwayne 2011-06-13 03:29:26

3

Postfix將數據庫中的密碼與使用鹽進行的新加密(來自db的密​​碼)進行比較。

加密:

update user set password = ENCRYPT('1234') where id = 1 

查詢密碼:

SELECT u.* FROM user u where u.email ='[email protected]' 
and ENCRYPT('1234', u.password) = u.password