cari
Rumahpembangunan bahagian belakangtutorial phpBagaimanakah Saya Boleh Melaksanakan Penyulitan Dua Hala Mudah dalam PHP Menggunakan OpenSSL?

How Can I Implement Simple Two-Way Encryption in PHP Using OpenSSL?

Penyulitan Dua Hala Paling Mudah dalam PHP

Nota Penting:

Sebelum meneruskan, adalah penting untuk menekankan bahawa artikel ini bertujuan untuk memberikan pemahaman yang dipermudahkan tentang penyulitan yang tidak disahkan. Untuk perlindungan data yang mantap, sentiasa pertimbangkan untuk menggunakan perpustakaan penyulitan disahkan standard industri atau bcrypt/argon2 untuk storan kata laluan.

Kaedah Kriptografi Asli

Jika menggunakan PHP 5.4 atau lebih baharu, pertimbangkan untuk menggunakan fungsi openssl_* untuk operasi kriptografi. Ini menawarkan fungsi penyulitan yang teguh dengan sokongan asli.

Penyulitan dan Penyahsulitan Mudah

Fungsi openssl_encrypt() dan openssl_decrypt() OpenSSL menyediakan cara yang boleh diakses untuk menyulitkan dan menyahsulit data. Algoritma penyulitan yang disyorkan ialah AES-CTR dalam varian 128, 192 atau 256-bitnya.

Awas: Elakkan menggunakan mcrypt kerana penamatannya dan potensi risiko keselamatan.

Pembungkus Penyulitan/Penyahsulitan Mudah

Untuk memudahkan penyulitan dan proses penyahsulitan, anda boleh menggunakan kelas pembalut berikut:

class UnsafeCrypto
{
    // Encryption method (CTR mode)
    const METHOD = 'aes-256-ctr';

    /**
     * Encrypts data using the specified key.
     *
     * @param string $message Plaintext message
     * @param string $key Encryption key
     * @param bool $encode Whether to encode the result
     *
     * @return string Ciphertext
     */
    public static function encrypt($message, $key, $encode = false)
    {
        // Generate random IV
        $ivSize = openssl_cipher_iv_length(self::METHOD);
        $iv = openssl_random_pseudo_bytes($ivSize);

        // Encrypt using OpenSSL
        $ciphertext = openssl_encrypt($message, self::METHOD, $key, OPENSSL_RAW_DATA, $iv);

        // Concatenate IV and ciphertext
        if ($encode) {
            return base64_encode($iv . $ciphertext);
        }
        return $iv . $ciphertext;
    }

    /**
     * Decrypts data using the specified key.
     *
     * @param string $message Ciphertext
     * @param string $key Encryption key
     * @param bool $encoded Whether the message is encoded
     *
     * @return string Decrypted message
     */
    public static function decrypt($message, $key, $encoded = false)
    {
        if ($encoded) {
            $message = base64_decode($message, true);
            if ($message === false) {
                throw new Exception('Encryption failure');
            }
        }

        // Extract IV and ciphertext
        $ivSize = openssl_cipher_iv_length(self::METHOD);
        $iv = substr($message, 0, $ivSize);
        $ciphertext = substr($message, $ivSize);

        // Decrypt using OpenSSL
        $plaintext = openssl_decrypt($ciphertext, self::METHOD, $key, OPENSSL_RAW_DATA, $iv);

        return $plaintext;
    }
}

Penyulitan Disahkan

Pendekatan di atas hanya menyediakan penyulitan, menjadikan data terdedah kepada gangguan. Untuk menangani perkara ini, laksanakan skim penyulitan yang disahkan:

class SaferCrypto extends UnsafeCrypto
{
    // MAC algorithm
    const HASH_ALGO = 'sha256';

    /**
     * Encrypts and authenticates data using the specified key.
     *
     * @param string $message Plaintext message
     * @param string $key Encryption key
     * @param bool $encode Whether to encode the result
     *
     * @return string Encrypted and authenticated data
     */
    public static function encrypt($message, $key, $encode = false)
    {
        // Split key into encryption and authentication keys
        list($encKey, $authKey) = self::splitKeys($key);

        // Encrypt using UnsafeCrypto::encrypt
        $ciphertext = parent::encrypt($message, $encKey);

        // Calculate MAC
        $mac = hash_hmac(self::HASH_ALGO, $ciphertext, $authKey, true);

        // Concatenate MAC and ciphertext
        if ($encode) {
            return base64_encode($mac . $ciphertext);
        }
        return $mac . $ciphertext;
    }

    /**
     * Decrypts and authenticates data using the specified key.
     *
     * @param string $message Encrypted and authenticated data
     * @param string $key Encryption key
     * @param bool $encoded Whether the message is encoded
     *
     * @throws Exception
     *
     * @return string Decrypted message
     */
    public static function decrypt($message, $key, $encoded = false)
    {
        // Split key
        list($encKey, $authKey) = self::splitKeys($key);

        // Decode message if necessary
        if ($encoded) {
            $message = base64_decode($message, true);
            if ($message === false) {
                throw new Exception('Encryption failure');
            }
        }

        // Extract MAC and ciphertext
        $hs = strlen(hash(self::HASH_ALGO, '', true), '8bit');
        $mac = substr($message, 0, $hs);
        $ciphertext = substr($message, $hs);

        // Calculate expected MAC
        $expectedMac = hash_hmac(self::HASH_ALGO, $ciphertext, $authKey, true);

        // Verify MAC
        if (!self::hashEquals($mac, $expectedMac)) {
            throw new Exception('Encryption failure');
        }

        // Decrypt message using UnsafeCrypto::decrypt
        $plaintext = parent::decrypt($ciphertext, $encKey);

        return $plaintext;
    }

    /**
     * Splits a key into two separate keys for encryption and authentication.
     *
     * @param string $masterKey Master key
     *
     * @return string[] Array of encryption and authentication keys
     */
    protected static function splitKeys($masterKey)
    {
        return [
            hash_hmac(self::HASH_ALGO, 'ENCRYPTION', $masterKey, true),
            hash_hmac(self::HASH_ALGO, 'AUTHENTICATION', $masterKey, true)
        ];
    }

    /**
     * Compares two strings without leaking timing information
     * (PHP 7+).
     *
     * @param string $a
     * @param string $b
     *
     * @return bool
     */
    protected static function hashEquals($a, $b)
    {
        if (function_exists('hash_equals')) {
            return hash_equals($a, $b);
        }

        $nonce = openssl_random_pseudo_bytes(32);
        return hash_hmac(self::HASH_ALGO, $a, $nonce) === hash_hmac(self::HASH_ALGO, $b, $nonce);
    }
}

Ingat, untuk keselamatan yang teguh, pertimbangkan untuk menggunakan perpustakaan penyulitan yang bereputasi.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Penyulitan Dua Hala Mudah dalam PHP Menggunakan OpenSSL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Cara membuat aplikasi php lebih cepatCara membuat aplikasi php lebih cepatMay 12, 2025 am 12:12 AM

Tomakephpapplicationsfaster, ikutiTheseSteps: 1) UseopcodecachinglikeopcachetostorePrecompiledscriptbytecode.2) minimizedatabasequeriesbyusingquerycachingandeficientindexing.3)

Senarai Semak Pengoptimuman Prestasi PHP: Meningkatkan Kelajuan SekarangSenarai Semak Pengoptimuman Prestasi PHP: Meningkatkan Kelajuan SekarangMay 12, 2025 am 12:07 AM

ToimprovePhpapPlicationspeed, ikutiTheSesteps: 1) EnableopCodeCachingWithApcutoreduceScriptExecutionTime.2) pelaksanaanDatabasequerycachingingPdotominimizedataBaseHits.3)

Suntikan Ketergantungan PHP: Meningkatkan kebolehlaksanaan kodSuntikan Ketergantungan PHP: Meningkatkan kebolehlaksanaan kodMay 12, 2025 am 12:03 AM

Suntikan ketergantungan (DI) dengan ketara meningkatkan kesesuaian kod PHP oleh kebergantungan transitif secara eksplisit. 1) Kelas Decoupling dan pelaksanaan khusus menjadikan ujian dan penyelenggaraan lebih fleksibel. 2) Di antara tiga jenis, pembina menyuntik kebergantungan ekspresi eksplisit untuk memastikan keadaan konsisten. 3) Gunakan bekas DI untuk menguruskan kebergantungan kompleks untuk meningkatkan kualiti kod dan kecekapan pembangunan.

Pengoptimuman Prestasi PHP: Pengoptimuman Pertanyaan Pangkalan DataPengoptimuman Prestasi PHP: Pengoptimuman Pertanyaan Pangkalan DataMay 12, 2025 am 12:02 AM

DatabaseQueryoptimizationInpinvolvesseverSlegatiesToenhancePratePratePratePratePratePregiesToRperformance.1) selectOnlynessaryColumnStoReducedatatatransfer.2) UseIndexingTospeedupdatareTrieval.3) PrevancequerycachingToStoreresultSoffReFfeFfffffffffffffffffffffffffffffffffffffffffffferseprewfffffffffffersepresseprespersepresperseprespersepresperseprespersepresperseprespers

Panduan Mudah: Menghantar E -mel dengan Skrip PHPPanduan Mudah: Menghantar E -mel dengan Skrip PHPMay 12, 2025 am 12:02 AM

Phpisusedforsendingemailsduetoitsbuilt-inmail () functionAndSupportivelibrariesLikePhpmailerandswiftmailer.1) usethemail () functionforbasiceMails, butithaslimitations.2) scorkphpmailerforadvancedfeatures

Prestasi PHP: Mengenalpasti dan menetapkan kesesakanPrestasi PHP: Mengenalpasti dan menetapkan kesesakanMay 11, 2025 am 12:13 AM

Kesesakan prestasi PHP boleh diselesaikan melalui langkah -langkah berikut: 1) Gunakan XDEBUG atau Blackfire untuk analisis prestasi untuk mengetahui masalah; 2) Mengoptimumkan pertanyaan pangkalan data dan menggunakan cache, seperti APCU; 3) Gunakan fungsi yang cekap seperti array_filter untuk mengoptimumkan operasi array; 4) Konfigurasi Opcache untuk cache bytecode; 5) mengoptimumkan bahagian depan, seperti mengurangkan permintaan HTTP dan mengoptimumkan gambar; 6) Memantau dan mengoptimumkan prestasi secara berterusan. Melalui kaedah ini, prestasi aplikasi PHP dapat ditingkatkan dengan ketara.

Suntikan Ketergantungan untuk PHP: Ringkasan CepatSuntikan Ketergantungan untuk PHP: Ringkasan CepatMay 11, 2025 am 12:09 AM

DependencyInjection (DI) inphpisadesignPatternThatManagesandReducesclassdependencies, enhancingcodemodularity, testility, andmaintainability.itallowspassingdependenciesLikedatabaseconnectionstoclassesesparameters, fasilitasieAseAsiShanandscalability.

Meningkatkan Prestasi PHP: Strategi & Teknik CachingMeningkatkan Prestasi PHP: Strategi & Teknik CachingMay 11, 2025 am 12:08 AM

CachingimprovesphpperformanceSbebyStoringResultsofcomputationsorqueriesforquickretrieval, reducingserverloadandenhancingResponsetimes.effectiveStRegiesClude: 1) Opcodecaching, yang

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Nordhold: Sistem Fusion, dijelaskan
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.