问题背景
我要做个登陆功能,验证登陆是否通过,是需要用户名和密码进行md5加密,看加密之后的结果是否和数据库中密码字段的值是否一致。
用户名是管理员,密码是123,数据库中存储的密码字段是把 管理员123 经过md5加密的字符串:82319127b7564366893f75d2be6902ac
我是用QT做的登陆页面,但把 管理员123 做md5加密后的串为:90b7c5372cfe68b05781b9782e197b
明显和数据库不一样
数据库中的密码加密是c#md5加密生成的
原因
经过测试,我发现数字,英文加密,c#和c++加密出来都是一样的,就是中文加密不一样,我猜想应该是编码的原因
我qt生成的md5的代码是这么写的:
QByteArray ba;
QCryptographicHash hash(QCryptographicHash::Md5); //使用MD5加密
ba.append(name1 + password); //"管理员123"
hash.addData(ba);
QByteArray array = hash.result();
QString passwd = array.toHex();
qDebug()<<passwd;
下面是c#加密的方法
public static string Generate(string txt)
{
using (MD5 mi = MD5.Create())
{
byte[] buffer = Encoding.Default.GetBytes(txt);
// 开始加密.
byte[] newBuffer = mi.ComputeHash(buffer);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < newBuffer.Length; i++)
{
sb.Append(newBuffer[i].ToString("x2"));
}
return sb.ToString();
}
}
可以看到c#中md5加密对传过来的txt字符串进行了默认编码Encoding.Default
Encoding.Default是采用系统编码
我就查系统编码是什么,cmd命令窗口打开
我的活动代码页为:936,它对应的编码格式为GBK。
而QT默认的编码(unicode)
也就是说,问题的原因是编码方式不一样造成的
解决方法
将QT中的字符串转为系统默认编码再进行md5加密就可以了
QString aa=name1 + password;//"管理员123"
QCryptographicHash hash(QCryptographicHash::Md5); //使用MD5加密
hash.addData(aa.toLocal8Bit()); //重点是这里
QByteArray array = hash.result(); //获取MD5加密后的密码
QString passwd = array.toHex();//把拿到的密码转为16进制
qDebug()<<passwd;
输出的passwd是 82319127b7564366893f75d2be6902ac 与数据库中的一致。
为什么这里要用 toLocal8Bit() ?
QString::Local8bit是本地操作系统设置的字符集编码