SodiumChachaIetf :: decrypt () harus dari tipe string, boolean

9

Saya melakukan migrasi Magento 1 ke Magento 2.3.0 semua baik tetapi ketika saya membuat bentuk pelanggan dari kedua sisi (depan dan admin) saya mendapatkan kesalahan yang terkait dengan mendekripsi bahkan saya tidak dapat mengedit pelanggan ketika saya mengklik simpan kesalahan yang sama telah terjadi .

Kesalahan di bawah ini adalah:

Kesalahan fatal: Uncaught TypeError: Nilai pengembalian Magento \ Framework \ Enkripsi \ Adaptor \ SodiumChachaIetf :: decrypt () harus dari tipe string, boolean dikembalikan ke public_html / vendor / magento / framework / Enkripsi / Adapter / SodiumChachaIetf.php: 68 Jejak tumpukan: # 0 public_html / vendor / magento / framework / Enkripsi / Encryptor.php (358): Magento \ Framework \ Enkripsi \ Adaptor \ SodiumChachaIetf-> mendekripsi ('"\ x10 \ x88 \ x8E \ xB5 \ x851; H \ xB1 \ x12 \ xE1aaP ... ')

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

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

# 3 public_html / vendor / dotmailer / dotmailer-magento2- extens di /public_html/vendor/magento/framework/Encryption/Adapter/SodiumChachaIetf.php di baris 68

Krunal Pandya
sumber

Jawaban:

16

Buka file Di bawah ini:

vendor / magento / framework / Enkripsi / Adaptor / SodiumChachaIetf.php

Dan Perbarui Kode Di Bawah Ini:

$plainText = sodium_crypto_aead_chacha20poly1305_ietf_decrypt(
            $payload,
            $nonce,
            $nonce,
            $this->key
        );
        if ($plainText == false)
        {
          return "";
        }
        return $plainText;
Rakesh Donga
sumber
3
Jangan mengedit file inti.
dudzio
Solusi di atas dari diskusi masalah magento github.com/magento/magento2/issues/19590
Barry
ini memperbaikinya untuk saya, tetapi apa masalahnya? Apakah ini hanya bug yang dikenal?
sam msft
11

Sepertinya Anda menggunakan kunci crypt yang salah.

Anda harus menyimpan kunci dari konfigurasi pratinjau Anda:

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>
[...]

Dan ganti yang baru di proyek baru:

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

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

Sumber: https://github.com/magento/magento2/issues/19590

Eduan Lenine
sumber
1
Ini terjadi pada saya setelah menyalin database dari server ke lokal, menyalin juga bantuan kunci dalam kunci itu.
BartZalas
1
jawaban sempurna dengan penjelasan !!! membuat hari saya :) +1
SagarPPanchal
5

Memodifikasi kelas inti tidak dianjurkan sama sekali. Masalahnya bukan pada kelasvendor/magento/framework/Encryption/Adapter/SodiumChachaIetf.php

Tetapi masalah dengan kunci crypt ditambahkan ke Andaapp/etc/env.php

Alasan masalah ini adalah kunci crypt tidak cocok. Anda harus mengambil dump database dari instance lain dan mencoba menjalankannya dengan instance Anda saat ini. Jadi bersama dengan database Anda perlu mendapatkan kunci crypt dari setup yang sama di mana dari Anda mendapat dump db.

Cukup perbarui kunci crypt di env.php dan itu akan berfungsi dengan baik.

Cara mengatasinya adalah dengan menggunakan kunci crypt yang sama dari instalasi dari tempat db sedang digunakan.

Semoga ini dijelaskan.

Tandai saya jika itu membantu. Selamat coding .. !!

Sandipan S
sumber
1
Ini memecahkan masalah untuk saya dan dirujuk dalam masalah gitub Magento ( github.com/magento/magento2/issues/19590#issuecomment-458731483 ). Saya pikir ini harus menjadi jawaban yang benar
caspertm
Baru saja menghapus kunci crypt dan itu membantu. Terima kasih!
Sergey Uskov
3

Buka file ini:

vendor / magento / framework / Enkripsi / Adaptor / SodiumChachaIetf.php

Dan perbarui kode di bawah ini:

 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;
    }

Cukup ubah tipe pengembalian fungsi: Dari

return $plainText

untuk

return (string) $plainText
Aarpi
sumber
Bekerja untuk saya ..!
Ashish Viradiya
1

Lebih banyak FYI masih di 2,3 mengembangkan cabang.

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

Perbaikan magento resmi adalah ini

    /**
     * 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 : '';
    }
Dominic Xigen
sumber