2014-09-06 63 views
0

我目前正在學習GUI應用程序的Qt5。我的第一個項目是製作一個認證腳本並將其連接到我們的數據庫。PHP crypt()到Qt

問題是密碼列由PHP的crypt()填充,它生成一個以$1$開頭的哈希字符串。

(如echo crypt("password");打印$1$d41.iA3.$XfuFXpCJfxSduzidGnKBR0

如何使用Qt來比較數據庫在我的GUI應用程序的密碼欄輸入的密碼長度由crypt()

回答

4

TL產生; DR: 使用一個用於密碼存儲的密鑰導出函數。


PHP的crypt()是可怕的t Ø從其他編程語言使用,因爲

  • 它用一種奇怪的方式混合鹽和密碼,而不是標準的HMAC
  • 它有它自己的base64字母表需要重新實現

除此之外,您使用普通md5作爲密碼哈希算法。 切勿使用md5進行密碼散列。​​。 And moreAnd more


但讓我們得到我們得心應手的骯髒然後。

  1. crypt()的輸出的結構如下:enter image description here其中算法$1$沒有算法選項裝置MD5。
  2. 散列密碼是base64 encoded using a custom alphabet。這可以通過用PHPs字母 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 替換QByteArray::toBase64()的輸出來存檔,或者如果性能很重要,則重新實施base64。
  3. 正如md5_crypt.c實現中所見,max。使用鹽的8個字符d41.iA3.是你的情況)。
  4. 然後輸入爲md5被構造爲foo = password || $1$ || salt其中||是字符串連接。使用QByteArray作爲foo的類型。
  5. Calculae md5(password || salt || password)並稱之爲bar
  6. bar = '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'
  7. 剪切從barlength(password)字節(二進制表示)並將其附加到foo。根據需要重複bar,如果length(password) > 16
  8. 烏夫,讓我引用原始來源然後,真的很奇怪...

    for (j = 0, i = length(password); i; i >>= 1) 
        if (i & 1) 
         foo += bar[j] 
        else 
         foo += password[j] 
    

    我希望我能從源頭上做好準備。

  9. 運行md5 on QByteArraybar = md5(foo)
  10. 做那

    for (i = 0; i < 1000; i++) { 
        moo = "" 
        if (i & 1) { 
         moo += password 
        } 
        else { 
         moo += bar 
        } 
        if (i % 3) { 
         moo += salt 
        } 
        if (i % 7) { 
         moo += password 
        } 
        if (i & 1) { 
         moo += bar 
        } 
        else { 
         moo += password 
        } 
        bar = md5(moo) 
    } 
    
  11. 膠水都在一起:$1$ || salt || $ || base64(bar)

+1

MD5可以是安全的*如果它正確應用在密鑰派生函數中,例如PBKDF2。當然,使用已知的良好函數比如SHA-2哈希函數之一更好。對於PBKDF2,可以選擇SHA1,因爲它具有更廣泛的可用性和兼容性。 – 2014-09-06 14:34:25

+0

嗯,實際上,當我來到這裏時,數據庫已經有數千個用戶,我可以推薦,但是沒有辦法用QT來模擬PHP crypt嗎?我的意思是生成相同的哈希字符串,如果使用相同的字符串和鹽?感謝您回答順便說一句。 – Cyr 2014-09-07 10:15:40

+0

我試圖收集所有步驟並更新了答案。希望最好的。隨時在需要的地方糾正問題。 – 2014-09-09 19:05:58