如何将 random_bytes 存储在 PHP 的数据库中?

How can I store random_bytes in a database in PHP?

在我的迁移中,我有一个名为 encryption_key 的字符串列,如下所示:

$table->string('encryption_key')->unique();

我有一个使用特征来生成加密命令的控制器。

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]: Invalid datetime format: 1366 Incorrect string value: '\xFFX\x8Af\x1F$...' for column 'encryption_key' at row 1 (SQL: insert into chat_headers (encryption_key) values (ÿXŠf\x1F$¨ì™ÒÂø¢Ú!£”…¸ÈÍØ7ÿDå\x00Œ¿3ê))

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

b"Bp,[\x1A\¢®ù·š(×g6ùs=l«j,©;_ó8ýòúÍ6"

我试过这样使用iconv()

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

这给了我

iconv(): Detected an illegal character in input string

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

您可以 base64_encode 存储它,并使用 base64_decode 撤消它。

将一组 accessor and mutator functions 放在一起可以让您自动执行此操作。