Laravel MSSQL二进制密码

时间:2019-02-23 22:05:07

标签: sql laravel sql-server-2008 binary

我正在通过网络修改旧系统。

我正在Laravel中完成所有工作,但是我错过了注册/登录主题。

我必须更改用于加密密码的功能的bcrypt

    function bcrypt($str, $options = []){
        //return app('hash')->make($value, $options);

        $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];
        } 

        while ($i < 16){ 
            $i++;
            $key[$i] = 0;
            $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;
    }
}

这是我的加密功能,但是我需要将密码保存在BINARY中。我有这个:

protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => 'bcrypt($data['password'])',
        ]);
    }

错误:SQLSTATE [42000]:[Microsoft] [用于SQL Server的ODBC驱动程序17] [SQL Server]没有允许使用二进制格式的字符串。实用工具转换为紧急咨询。 (SQL:插入[user_auth]([name],[email],[password],[updated_at],[created_at])值(Nombre,email@email.com,0xb13f7b1e2fc16d380d94b2b27fe5c3c3,2019-02-13 12:37: 58.817,2019-02-13 12:37:58.817))

我将创建功能更改为:

protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => 'CONVERT(binary, '.bcrypt($data['password']).')',
        ]);
    }

但是它将保存密码,例如:CONVERT(binary,'0xb13f7b1e2fc16d380d94b2b27fe5c3c3),而不将其转换为二进制。

有解决方案吗?

0 个答案:

没有答案