【问题标题】:Problem Inserting password into sql server db将密码插入sql server db的问题
【发布时间】:2018-11-18 19:07:28
【问题描述】:

我正在尝试将密码插入 sql server db。密码已经像这样0x29E59C9B1ABD5F2DF024CCAC61FBDDDD来自加密它的功能。列数据类型是binary(16),但是当我执行查询时,它返回了

不允许从数据类型 varchar 到二进制的隐式转换。 使用 CONVERT 函数运行此查询。

尝试使用Convert(binary(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; }

这是对 db(codeigniter) 的插入

public function register_user_account($data4) {
        $db2= $this->load->database('mssqlsrv',TRUE);
        $db2->insert("user_account", $data4);
        $db2->close();
}    

这就是我将数据从表单传递到控制器以提交的方式

$this->Game_Account_Model->register_user_auth([
                                    "account" => $acc_name,
                                    "password" => encrypt($pass),
                "something" => '_',
                "something2" => '_',
                                    "something1" => encrypt($pass),
                                    "something" => encrypt($pass)
                ]
     );

【问题讨论】:

  • 在此处发布您的代码。
  • 看起来它试图将其作为 varchar 发送,但 db 中的数据类型是二进制?
  • 不是真正的主题,但您应该认真考虑不加密密码.. 安全地散列它们。加密是可逆的,散列不是。
  • 我知道,但这是第 3 方应用程序的工作方式,密码必须以这种方式存储。

标签: php sql-server codeigniter insert


【解决方案1】:

您将 VARCHAR 发送到 SQL,其中列设置为二进制,您可以做的事情是:

  1. 将 SQL 列设置为 VARCHAR 即可。

  2. 使用 base_convert() 函数将字符串转换为二进制。参考:http://ca3.php.net/base_convert

将二进制转换为可读字符串:

你可以使用 unpack() - http://php.net/manual/en/function.unpack.php

将字符串转换为二进制

你也可以检查 pack() - http://php.net/manual/en/function.pack.php

【讨论】:

  • 1.无法更改列的数据类型,因为程序从那里读取。你认为 CAST 可能有用吗?
  • 你试过base_convert()吗?您是否收到任何错误,如果是,它们是什么?在这种情况下,类型转换肯定不起作用,因为字符串中有字母字符。如果它们只是数字,它可以工作,即使类型转换不起作用,如果字符串只包含数字,decbin() 函数也可以工作。
  • 我怎么可能使用 base_convert。你能给我举个例子吗?我也尝试将列的数据类型更改为 varchar,但从读取此信息的应用程序无法登录。它必须设置为二进制
  • 也许我可以将所需的数据发送到存储过程并让它进行插入?
  • pastebin.com/QaMqYktM有个啧啧,怎么用base_convert();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2013-06-02
  • 1970-01-01
  • 2016-04-19
  • 2011-01-20
  • 1970-01-01
相关资源
最近更新 更多