如何在PHP数据库中存储随机_字节?

如何在PHP数据库中存储随机_字节?,php,laravel,laravel-5,encryption,libsodium,Php,Laravel,Laravel 5,Encryption,Libsodium,在迁移过程中,我有一个名为encryption\u key的字符串列,如下所示: $table->string('encryption_key')->unique(); b"Bp,[\x1A\¢®ù·š(×g6ùs=l«j,©;_ó8ýòúÍ6" 我有一个控制器,它使用特征生成加密命令 use LiveChat; public function create() { $this->header->insert([ 'encryption_ke

在迁移过程中,我有一个名为
encryption\u key
的字符串列,如下所示:

$table->string('encryption_key')->unique();
b"Bp,[\x1A\¢®ù·š(×g6ùs=l«j,©;_ó8ýòúÍ6"
我有一个控制器,它使用特征生成加密命令

use LiveChat;

public function create()
{
    $this->header->insert([
        'encryption_key' => $this->issueKey()
    ]);

    $this->participants->insert([
        'chat_id' => DB::getPdo()->lastInsertId(),
        'user_id' => Auth::id()
    ]);

    return response(['status' => true, 'chat_id' => DB::getPdo()->lastInsertId()], 200)
        ->header('Content-Type', 'application/json');
}
到目前为止,这个特征看起来是这样的

trait LiveChat
{
    protected function issueKey()
    {
        return random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES);
    }
}
但是,在进行测试时,我收到以下错误:

SQLSTATE[22007]:无效的日期时间格式:1366不正确的字符串值:'\xFFX\x8Af\x1F$…'用于第1行的“加密密钥”列(SQL:插入到
chat_头
encryption_-key
)值(XŠf\x1F$)™ÒÒÚ!“…¸ߕØ7ÿDå\x00Œ3”)

如果我使用
dd()
调试
$this->issueKey()
的响应,我会得到如下结果:

$table->string('encryption_key')->unique();
b"Bp,[\x1A\¢®ù·š(×g6ùs=l«j,©;_ó8ýòúÍ6"
我试过像这样使用
iconv()

iconv("UTF-8", "ASCII", $this->issueKey())
这让我

iconv():在输入字符串中检测到非法字符


如何将此密钥存储在数据库中以供将来参考?

您可以对其进行
base64\u编码
存储,然后使用
base64\u解码
将其撤消


把一组数据放在一起,可以让你自动完成这项工作。

base64\u对其进行编码。从数据库访问时,请使用
base64\u decode
。一个mutator/accessor函数(参见文档)可能对这一点很有用。你是一个明星!我没有考虑使用
base64.*
——这样做很有意义。如果您想放置一个答案,我会将其标记为已接受@ceejayozor,您可以bin2hex(随机字节(Na钠加密加密箱密钥字节));为什么不使用二进制列呢?没有大小膨胀,也没有SQL以外的操作。@LukeJoshuaPark足够公平。加上这个作为答案!