【问题标题】:Laravel 5.3 & Crypt - invalid payloadLaravel 5.3 和 Crypt - 无效负载
【发布时间】:2018-05-07 05:12:09
【问题描述】:

我有一个使用 Laravel 5.23 编写的应用程序。在其中,我使用以下方法对某些敏感的用户数据进行加密,然后再将其存储在表中:

'Crypt'     => Illuminate\Support\Facades\Crypt::class,

该字段的迁移是:

$table->string('field_account_name')->nullable();

我在课堂上设置了修改器来执行此操作:

public function getFieldAccountNameClearAttribute($value)
{
    if ($this->field_account_name) {
        try {
            return Crypt::decrypt($this->field_account_name);
        } catch (DecryptException $e) {
            return 'INVALID';
        }
    } else {
        return $this->field_account_name;
    }
}

public function setFieldAccountNameClearAttribute($value)
{
    $this->attributes['field_account_name'] = Crypt::encrypt($value);
}

这已经完美运行了很长时间,但是一个用户在一周前放弃了他们的魔法并触发了:

Exception 'ErrorException' with message 'The payload is invalid

我已经设法通过在字段中放置特殊字符(例如')作为带有空格的长字符串的一部分来复制该问题。

日期已加密并存储,但检索时失败。

为了避免这种情况,我应该从前端的加密中排除哪些字符?我找不到这个问题的答案。

或者该字段应该是text 而不是字符串?

【问题讨论】:

  • 你应该使用text而不是varchar

标签: php encryption laravel-5.2


【解决方案1】:

问题可能与您尝试加密的数据量以及它在数据库中的存储方式有关。如果密文超过255个字符,入库时会被截断,无法解密。

您应该将现有迁移更新为:

$table->text('field_account_name')->nullable();

或在新的迁移中使用以下内容:

$table->text('field_account_name')->nullable()->change();

【讨论】:

  • 谢谢。我将字段更改为TEXT,现在一切正常。
猜你喜欢
  • 2017-11-22
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多