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))

#3 public_html / vendor / dotmailer / dotmailer-magento2-extens / 68行目の/public_html/vendor/magento/framework/Encryption/Adapter/SodiumChachaIetf.php内

回答:


16

以下のファイルに移動します。

vendor / magento / framework / Encryption / Adapter / SodiumChachaIetf.php

そして以下のコードを更新:

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

3
コアファイルは編集しないでください。
dudzio

上記の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

この問題の理由は、暗号化キーが一致していないためです。他のインスタンスからデータベースダンプを取得し、現在のインスタンスで実行しようとしている必要があります。したがって、データベースとともに、dbダンプを取得したのと同じ設定から暗号鍵を取得する必要があります。

env.phpcryptキーを更新するだけで問題なく動作します。

修正は、dbが使用されている場所からのインストールと同じ暗号鍵を使用することです。

説明されているといいのですが。

参考になった場合はマークアップしてください。幸せなコーディング.. !!


1
これで問題が解決し、Magento githubの問題(github.com/magento/magento2/issues/19590#issuecomment-458731483)で参照されました。これは正解だと思います
caspertm

暗号化キーを削除しただけで役に立ちました。ありがとう!
セルゲイウスコフ

3

このファイルに移動します。

vendor / magento / framework / Encryption / Adapter / 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

さらに、FYIはまだ2.3でブランチを開発しています。

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 : '';
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.