c++加密和c#加密结果不一样的原因及解决办法

问题背景

我要做个登陆功能,验证登陆是否通过,是需要用户名和密码进行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是本地操作系统设置的字符集编码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值