PHP 加密只不過是藉助一些演算法來實現加密程式碼,這些演算法有時稱為雜湊演算法,它們通常透過獲取字串或其他一些輸入來工作,然後它將有助於從字串創建唯一的指紋/其他。加密涉及將特定文本/其他文本更改為某種不同的程式碼文字或其他文本,只是為了使資料安全,而不暴露給大多數人(除了一些有權訪問的人)。請參閱下面不同類型的 PHP 加密方法。
廣告 該類別中的熱門課程 PHP 開發人員 - 專業化 | 8 門課程系列 | 3次模擬測驗開始您的免費軟體開發課程
網頁開發、程式語言、軟體測試及其他
目前使用的加密方法有很多種,但最常見的是雜湊法,第二種是金鑰加密法,第三種是信封加密法。對於每種加密方法,都有多種演算法或加密可供選擇(每種加密方法都有自己的弱點和優點)。這裡我們將重點放在散列和密鑰加密的實作。
PHP 程式語言的雜湊演算法通常採用一個輸入值,然後將其轉換為一個訊息摘要。簡而言之,純文字值將被轉換為固定長度的雜湊值,並且只能繞過一個原始值到唯一的雜湊演算法來驗證它。這將使哈希完美地存儲所有用戶密碼。
值得注意的是,雜湊對於我們的查詢來說根本不是萬無一失的解決方案,但有些查詢不會擁有所有相同的雜湊演算法。我們考慮了高效且快速的 MD5 和 SHA1 演算法,然後使所有這些成為文件驗證和校驗和的理想選擇。它們的速度使得它們中的大多數不適合對用戶密碼進行雜湊處理。憑藉現代 GPU 的運算能力,只需在幾分鐘內使用暴力破解,只需揭示原始明文密碼和故意使用較慢的雜湊演算法(例如 bcrypt)即可破解密碼。或將使用Argon2。
對用演算法產生的密碼進行雜湊處理,那麼它肯定會掩蓋實際和原始數據,然後會減慢攻擊者的速度,而開發人員應該嘗試一種可用的最強演算法。 PHP 語言有一個基本語法,就是password_hash()。
這是使用雜湊技術「bcrypt」的範例。
代碼:
<?php $str1 = 'Password'; $options1 = [ 'cost1' => 10, 'salt1' => '$P27r06o9!nasda57b2M22' ]; echo sprintf("The Result of crypt() function on %s is %s\n", $str1, crypt($str1, $options1['salt1'])); echo "<br>"; echo sprintf("The Result of DEFAULT function on %s is %s\n", $str1, password_hash($str1, PASSWORD_DEFAULT)); echo "<br>"; echo sprintf("The Result of BCRYPT function on %s is %s\n", $str1, password_hash($str1, PASSWORD_BCRYPT, $options1)); echo "<br>"; ?>
輸出:
PHP 的金鑰加密通常使用一個金鑰來加密和解密資料。它也稱為對稱加密。為此,如果您執行的是舊版本的 PHP 程式語言,請透過 PECL 安裝 PHP 程式語言的鈉。
首先,您需要使用 random_bytes() 函數程式碼實際產生的加密金鑰。但通常,您只需執行一次並將其儲存為環境變數。這是我們必須保守秘密的關鍵。如果密鑰已知,那麼加密的內容也會被洩漏。
$secret_key = random_bytes (SODIUM_CRYPTO_SECRETBOX_KEYBYTES);
為了使用我們的金鑰/秘密金鑰和 $nonce 加密將要傳遞給odium_crypto_secretbox() 函數的值。然後使用 random_bytes() 函數產生隨機數變量,這只是因為不能使用相同/相似的隨機數。
$nonce = random_bytes(SODIUM_CRYPTO_NONCEBYTES); $ciphertext = sodium_crypto_secretbox(‘This is secret key!!!’, $nonce, $secret_key);
這將代表問題,因為我們需要那個隨機數,它將稍後/之後解密該值。但是 NONCE/NONCES 沒有任何金鑰可以保密,因此我們可以輕鬆地將其作為 $ciphertext 前置,然後 base64_encode() 函數是將其儲存到實際資料庫之前發生的值。
$encoded1 = base64_encode($nonce . $ciphertext); Var_dump($encoded1);
以上語法僅用於加密值。為了解碼/解密編碼值,請使用下列語法。
$decoded1 = base64_decode($encoded1);
在解密值之前,將使用 mb_substr() 函數來擷取隨機數變數或函數的長度。
這是實作 random_bytes() 函數的範例,以了解金鑰加密。這裡隨機字串的長度將藉助二進制十六進制進行轉換,以確保字串中的隨機位元組。
Code:
<?php $length1 = random_bytes('3'); var_dump(bin2hex($length1)); ?>
Output:
We all know that our data is vulnerable if our secret key is known/compromised. Just consider that a malicious user/attacker got access to the server point which is actually hosting our application/other. In this situation, attacker most of the times gets/discovers out the secret key which should be kept as secret. If it is discovered then our data may be in danger of exposing to the malicious user/attacker.
We can use Cloud KMS service which is actually provided by the Google Cloud Key Management Service. It provided a wide variety of so many useful features. It includes automatic key rotation and also the delayed key destruction capability.
Before sending plaintext to the CLOUD KMS, generate a unique encryption key each and every time when we actually write the data to the database. This key is called DEK (Data Encryption Key) which is actually used in encrypting the data. DEK which is sent to the Google Cloud KMS will be encrypted and then it will return the KEK (key encryption key). At last, KEK will be stored side by side in the actual database point which is next to the encrypted data and then the DEK will be destroyed.
Check out the data encryption and decryption as below:
I hope you learned what is the definition of PHP Encryption and along with the various types of PHP Encryption methods along with the examples by mentioning their brief description. An example is shown here for envelope encryption because it is cloud-based encryption.
以上是PHP加密的詳細內容。更多資訊請關注PHP中文網其他相關文章!