PHP crypt()到Qt

时间:2014-09-06 10:05:34

标签: php qt cryptography crypt

我目前正在学习用于GUI应用程序的Qt5。我的第一个项目是创建一个身份验证脚本并将其连接到我们的数据库。

问题是密码列是由PHP crypt()填充的,它生成一个以$1$开头的哈希字符串。

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

如何使用Qt将我的GUI应用程序中输入的密码与crypt()生成的数据库中的密码列进行比较?

1 个答案:

答案 0 :(得分:4)

<强> TL; DR: 使用密钥派生函数进行密码存储。


PHP crypt()使用其他编程语言非常糟糕,因为

  • 它使用一种奇怪的方式混合盐和密码,而不是标准HMAC
  • 它有自己的base64字母表,需要重新实现

除此之外,您使用普通md5作为密码哈希算法。 切勿使用md5进行密码散列。 Read moreAnd moreAnd more


但是,让我们得到方便的话。

  1. crypt()输出的结构如下:enter image description here其中没有算法选项的算法$1$ 表示MD5。
  2. 哈希密码为base64 encoded using a custom alphabet。这可以通过用PHP字母替换QByteArray::toBase64()的输出来存档 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz 如果性能很重要,则重新实施base64。
  3. md5_crypt.c实施中所见,最多使用了8个 salt 字符(d41.iA3.就是你的情况)。
  4. 然后将md5的输入构造为foo = password || $1$ || salt,其中||是字符串连接。使用QByteArray作为foo
  5. 的类型
  6. 计算md5(password || salt || password)并将其称为bar
  7. 设置bar = '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'
  8. length(password)剪切bar字节(以二进制表示形式)并将其附加到foo。如果bar
  9. ,请根据需要经常重复length(password) > 16
  10. Uff,让我引用原始来源然后真的很奇怪......

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

    我希望我能从源头做好准备。

  11. 运行md5 on QByteArraybar = md5(foo)
  12. 那样做

    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)
    }
    
  13. 将所有内容粘合在一起:$1$ || salt || $ || base64(bar)