首頁 >後端開發 >php教程 >如何在PHP中實現簡單的雙向加密和認證?

如何在PHP中實現簡單的雙向加密和認證?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-24 02:10:13218瀏覽

How Can I Implement Simple Two-Way Encryption and Authentication in PHP?

使用PHP 最簡單的雙向加密

背景

警告:避免使用這些方法加密密碼;相反,採用這些方法加密密碼;相反,採用密碼哈希演算法來安全儲存密碼。

PHP 中的可移植資料加密

當使用 PHP 5.4 或更高版本並希望程式碼可攜性時,請利用提供經過驗證的加密的現有程式庫。一旦您選擇了加密方法,您就可以使用 Openssl 方法,例如 openssl_encrypt() 和 openssl_decrypt()。

加密和解密

考慮使用高級加密標準 (AES)用於加密的 CTR 模式。此方法提供了安全性和效能之間的最佳平衡。請參閱 openssl_get_cipher_methods() 以取得支援的方法清單。

使用 OpenSSL 的簡單加密/解密包裝器

以下 PHP 類別提供了使用 OpenSSL 的簡單加密/解密包裝器:

class UnsafeCrypto
{
    const METHOD = 'aes-256-ctr';

    public static function encrypt($message, $key, $encode = false)
    {
        // ...
        if ($encode) {
            return base64_encode($nonce.$ciphertext);
        }
        return $nonce.$ciphertext;
    }

    public static function decrypt($message, $key, $encoded = false)
    {
        // ...
        $plaintext = openssl_decrypt(
            $ciphertext,
            self::METHOD,
            $key,
            OPENSSL_RAW_DATA,
            $nonce
        );
        
        return $plaintext;
    }
}

簡單的身份驗證包裝器

為了增強安全性,實施身份驗證以驗證加密資料的完整性:

class SaferCrypto extends UnsafeCrypto
{
    const HASH_ALGO = 'sha256';

    public static function encrypt($message, $key, $encode = false)
    {
        // ...
        if ($encode) {
            return base64_encode($mac.$ciphertext);
        }
        // Prepend MAC to the ciphertext and return to caller
        return $mac.$ciphertext;
    }

    public static function decrypt($message, $key, $encoded = false)
    {
        // ...
        $calculated = hash_hmac(
            self::HASH_ALGO,
            $ciphertext,
            $authKey,
            true
        );
        
        if (!self::hashEquals($mac, $calculated)) {
            throw new Exception('Encryption failure');
        }
        
        // Pass to UnsafeCrypto::decrypt
        $plaintext = parent::decrypt($ciphertext, $encKey);
        
        return $plaintext;
    }
}

以上是如何在PHP中實現簡單的雙向加密和認證?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn