我目前正在学习用于GUI应用程序的Qt5。我的第一个项目是创建一个身份验证脚本并将其连接到我们的数据库。
问题是密码列是由PHP crypt()
填充的,它生成一个以$1$
开头的哈希字符串。
(例如echo crypt("password");
打印$1$d41.iA3.$XfuFXpCJfxSduzidGnKBR0
如何使用Qt将我的GUI应用程序中输入的密码与crypt()
生成的数据库中的密码列进行比较?
答案 0 :(得分:4)
<强> TL; DR:强> 使用密钥派生函数进行密码存储。
PHP crypt()
使用其他编程语言非常糟糕,因为
除此之外,您使用普通md5作为密码哈希算法。 切勿使用md5进行密码散列。 Read more。 And more。 And more
但是,让我们得到方便的话。
crypt()
输出的结构如下:其中没有算法选项的算法$1$
表示MD5。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
如果性能很重要,则重新实施base64。d41.iA3.
就是你的情况)。foo = password || $1$ || salt
,其中||
是字符串连接。使用QByteArray作为foo
。md5(password || salt || password)
并将其称为bar
。bar = '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'
length(password)
剪切bar
字节(以二进制表示形式)并将其附加到foo
。如果bar
。length(password) > 16
Uff,让我引用原始来源然后真的很奇怪......
for (j = 0, i = length(password); i; i >>= 1)
if (i & 1)
foo += bar[j]
else
foo += password[j]
我希望我能从源头做好准备。
bar = md5(foo)
。那样做
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)
}
将所有内容粘合在一起:$1$ || salt || $ || base64(bar)
。