2014-09-06 61 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