SodiumChachaIetf :: decrypt()必须为字符串类型,布尔值


9

我确实将Magento 1迁移到Magento 2.3.0一切都很好,但是当我创建客户双方(前台和管理员)的表单时,我都遇到了与解密相关的错误,即使单击保存时我也无法编辑客户,但发生了同样的错误。

下面的错误是:

致命错误:未捕获的TypeError:Magento \ Framework \ Encryption \ Adapter \ SodiumChachaIetf :: decrypt()的返回值必须为字符串类型,在public_html / vendor / magento / framework / Encryption / Adapter / SodiumChachaIetf.php:68中返回的布尔值堆栈跟踪:#0 public_html / vendor / magento / framework / Encryption / Encryptor.php(358):Magento \ Framework \ Encryption \ Adapter \ SodiumChachaIetf-> decrypt('“ \ x10 \ x88 \ x8E \ xB5 \ x851; H \ xB1 \ x12 \ xE1aaP ...')

#1 /public_html/vendor/dotmailer/dotmailer-magento2-extension/Helper/Data.php(744):Magento \ Framework \ Encryption \ Encryptor-> decrypt('IhCIjrWFMTtIsRL ...')

#2 /public_html/vendor/dotmailer/dotmailer-magento2-extension/Helper/Data.php(203):Dotdigitalgroup \ Email \ Helper \ Data-> getApiPassword(Object(Magento \ Store \ Model \ Website \ Interceptor))

在第68行的/public_html/vendor/magento/framework/Encryption/Adapter/SodiumChachaIetf.php中#3 public_html / vendor / dotmailer / dotmailer-magento2- extens扩展

Answers:


16

转到以下文件:

供应商/ magento /框架/加密/适配器/SodiumChachaIetf.php

并更新以下代码:

$plainText = sodium_crypto_aead_chacha20poly1305_ietf_decrypt(
            $payload,
            $nonce,
            $nonce,
            $this->key
        );
        if ($plainText == false)
        {
          return "";
        }
        return $plainText;

3
不要编辑核心文件。
dudzio '19

以上来自magento问题讨论的解决方案github.com/magento/magento2/issues/19590
Barry

这为我解决了问题,但是出了什么问题?这只是一个已知的错误吗?
sam msft

11

看起来您使用的是错误的密钥。

您应该保留预览配置中的密钥:

app / etc / local.xml [Magento 1.x]

<?xml version="1.0"?>
<config>
  <global>
    <install>
      <date>{{date}}</date>
    </install>
    <crypt>
       <key>123456_same_old_key_7890</key>
    </crypt>
[...]

并在新项目中替换新的:

app / etc / env.php [Magento 2.x]

<?php
[...],
'crypt' => [
    'key' => '123456_same_old_key_7890'
],
[...]

资料来源:https : //github.com/magento/magento2/issues/19590


1
在将数据库从服务器复制到本地之后,这也发生在我身上,同时也在该键中复制了关键帮助。
BartZalas

1
完美的解释!让我开心:) +1
SagarPPanchal

5

完全不建议修改核心类。问题不在班上vendor/magento/framework/Encryption/Adapter/SodiumChachaIetf.php

但是加密密钥的问题已添加到您的app/etc/env.php

此问题的原因是密钥不匹配。您必须已经从其他任何实例中提取了数据库转储,并尝试与当前实例一起运行。因此,与数据库一起,您需要从获得数据库转储的相同设置中获取密钥

刚刚更新的密钥保存env.php,它会正常工作。

解决方法是在使用db的位置使用与安装相同的密钥。

希望它得到解释。

如果有帮助,请标记我。祝您编码愉快!!


1
这为我解决了这个问题,并在Magento github问题(github.com/magento/magento2/issues/19590#issuecomment-458731483)中进行了引用。我认为这应该是正确的答案
caspertm

刚刚删除了密钥,它有所帮助。谢谢!
谢尔盖·乌斯科夫

3

转到此文件:

供应商/ magento /框架/加密/适配器/SodiumChachaIetf.php

并更新以下代码:

 public function decrypt(string $data): string
    {
        $nonce = mb_substr($data, 0, SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES, '8bit');
        $payload = mb_substr($data, SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES, null, '8bit');

        $plainText = sodium_crypto_aead_chacha20poly1305_ietf_decrypt(
            $payload,
            $nonce,
            $nonce,
            $this->key
        );

        return (string) $plainText;
    }

只需更改函数的返回类型:From

return $plainText

return (string) $plainText

为我工作..!
Ashish Viradiya

1

仍然供2.3 FYI开发的分支机构。

https://github.com/magento/magento2/blob/2.3-develop/lib/internal/Magento/Framework/Encryption/Adapter/SodiumChachaIetf.php

官方的magento修复是这个

    /**
     * Decrypt a string
     *
     * @param string $data
     * @return string
     */
    public function decrypt(string $data): string
    {
        $nonce = mb_substr($data, 0, SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES, '8bit');
        $payload = mb_substr($data, SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES, null, '8bit');
        try {
            $plainText = sodium_crypto_aead_chacha20poly1305_ietf_decrypt(
                $payload,
                $nonce,
                $nonce,
                $this->key
            );
        } catch (\SodiumException $e) {
            $plainText = '';
        }
        return $plainText !== false ? $plainText : '';
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.