Php 将密码插入sql server数据库时出现问题
我正在尝试将密码插入sql server数据库。密码在加密它的函数中已经是这样的Php 将密码插入sql server数据库时出现问题,php,sql-server,codeigniter,insert,Php,Sql Server,Codeigniter,Insert,我正在尝试将密码插入sql server数据库。密码在加密它的函数中已经是这样的0x29E59C9B1ABD5F2DF024CCAC61FBDDDD。列数据类型是二进制的(16),但是当我执行查询时,它返回 不允许从数据类型varchar隐式转换为二进制。 使用CONVERT函数运行此查询 尝试使用Convert(二进制(16)),但我得到了相同的错误。有什么想法吗?所有这些都是用PHP实现的 此函数用于加密我的密码 enter code here function encrypt($
0x29E59C9B1ABD5F2DF024CCAC61FBDDDD
。列数据类型是二进制的(16),但是当我执行查询时,它返回
不允许从数据类型varchar隐式转换为二进制。
使用CONVERT函数运行此查询
尝试使用Convert(二进制(16))
,但我得到了相同的错误。有什么想法吗?所有这些都是用PHP实现的
此函数用于加密我的密码
enter code here
function encrypt($str) {
$key = array();
$dst = array();
$i = 0;
$nBytes = strlen($str);
while ($i < $nBytes){
$i++;
$key[$i] = ord(substr($str, $i - 1, 1));
$dst[$i] = $key[$i];
}
$rslt = $key[1] + $key[2]*256 + $key[3]*65536 + $key[4]*16777216;
$one = $rslt * 213119 + 2529077;
$one = $one - intval($one/ 4294967296) * 4294967296;
$rslt = $key[5] + $key[6]*256 + $key[7]*65536 + $key[8]*16777216;
$two = $rslt * 213247 + 2529089;
$two = $two - intval($two/ 4294967296) * 4294967296;
$rslt = $key[9] + $key[10]*256 + $key[11]*65536 + $key[12]*16777216;
$three = $rslt * 213203 + 2529589;
$three = $three - intval($three/ 4294967296) * 4294967296;
$rslt = $key[13] + $key[14]*256 + $key[15]*65536 + $key[16]*16777216;
$four = $rslt * 213821 + 2529997;
$four = $four - intval($four/ 4294967296) * 4294967296;
$key[4] = intval($one/16777216);
$key[3] = intval(($one - $key[4] * 16777216) / 65535);
$key[2] = intval(($one - $key[4] * 16777216 - $key[3] * 65536) / 256);
$key[1] = intval(($one - $key[4] * 16777216 - $key[3] * 65536 - $key[2] * 256));
$key[8] = intval($two/16777216);
$key[7] = intval(($two - $key[8] * 16777216) / 65535);
$key[6] = intval(($two - $key[8] * 16777216 - $key[7] * 65536) / 256);
$key[5] = intval(($two - $key[8] * 16777216 - $key[7] * 65536 - $key[6] * 256));
$key[12] = intval($three/16777216);
$key[11] = intval(($three - $key[12] * 16777216) / 65535);
$key[10] = intval(($three - $key[12] * 16777216 - $key[11] * 65536) / 256);
$key[9] = intval(($three - $key[12] * 16777216 - $key[11] * 65536 - $key[10] * 256));
$key[16] = intval($four/16777216);
$key[15] = intval(($four - $key[16] * 16777216) / 65535);
$key[14] = intval(($four - $key[16] * 16777216 - $key[15] * 65536) / 256);
$key[13] = intval(($four - $key[16] * 16777216 - $key[15] * 65536 - $key[14] * 256));
$dst[1] = $dst[1] ^ $key[1];
$i=1;
while ($i<16){
$i++;
$dst[$i] = $dst[$i] ^ $dst[$i-1] ^ $key[$i];
}
$i=0;
while ($i<16){
$i++;
if ($dst[$i] == 0) {
$dst[$i] = 102;
}
}
$encrypt = "0x";
$i=0;
while ($i<16){
$i++;
if ($dst[$i] < 16) {
$encrypt = $encrypt . "0" . dechex($dst[$i]);
} else {
$encrypt = $encrypt . dechex($dst[$i]);
}
}
return $encrypt; }
这就是我将数据从表单传递给控制器以便提交的方式
$this->Game_Account_Model->register_user_auth([
"account" => $acc_name,
"password" => encrypt($pass),
"something" => '_',
"something2" => '_',
"something1" => encrypt($pass),
"something" => encrypt($pass)
]
);
您将VARCHAR发送到SQL,其中列设置为二进制,您可以执行以下操作:
张贴你的代码。看起来它试图发送它作为VARCHAR,但是数据类型在DB中是二进制的。实际上不是在主题上,但是你应该认真考虑不加密密码。安全地散列它们。加密是可逆的,散列不是。我知道,但这就是第三方应用程序的工作方式,密码必须以这种方式存储。1。无法更改列的数据类型,因为程序从中读取。你认为这个CAST可能有用吗?你试过base_convert()吗?您是否有任何错误,如果有,是什么错误?在这种情况下,typecast肯定不起作用,因为字符串中有字母字符。如果它们只是数字,它就可以工作,即使类型转换不起作用,如果字符串只包含数字,decbin()函数也可以工作。我怎么可能使用base_convert呢。你能给我举个例子吗?我还尝试将列的数据类型更改为varchar,但从读取此信息的应用程序登录失败。它必须设置为Binary。也许我可以将所需的数据发送到存储过程,让它执行插入操作?有一个tut,如何使用base_convert();
$this->Game_Account_Model->register_user_auth([
"account" => $acc_name,
"password" => encrypt($pass),
"something" => '_',
"something2" => '_',
"something1" => encrypt($pass),
"something" => encrypt($pass)
]
);