W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
重要
請勿使任何 encryption 庫來存儲密碼! 密碼必須使用 散列 ,而你應(yīng)該通過 PHP的密碼散列擴(kuò)展 進(jìn)行散列 。
加密服務(wù)提供雙向?qū)ΨQ(密鑰)數(shù)據(jù)加密。該服務(wù)將實例化或初始化 加密程序 以適配你的參數(shù),如下所述。
加密處理程序必須實現(xiàn)CodeIgniter的 EncrypterInterface
接口 。使用 PHP 密碼擴(kuò)展或其它第三方庫可能需要在服務(wù)器上安裝其他軟件, 并且可能需要在 PHP 實例啟用。
支持以下拓展:
這并不是一套完整的密碼解決方案。如果您需要更多功能(例如公鑰加密),建議你考慮直接使用 OpenSSL 或其他 密碼學(xué)擴(kuò)展 。 還有一種更全面的軟件包,例如 Halite (基于libsodium構(gòu)建的 O-O 軟件包)。
注解
自從PHP 7.2起就已棄用了對MCrypt
擴(kuò)展的支持。
就像CodeIgniter的其他服務(wù),它可以通過 Config\Services
來調(diào)用:
$encrypter = \Config\Services::encrypter();
如果你已設(shè)置了啟動密鑰(請參閱 配置加密類庫 ),那么加密和解密數(shù)據(jù)很簡單,將適當(dāng)?shù)淖址畟鬟f給 encrypt()
或 decrypt()
方法:
$plainText = 'This is a plain-text message!';
$ciphertext = $encrypter->encrypt($plainText);
// 輸出: This is a plain-text message!
echo $encrypter->decrypt($ciphertext);
就是這樣!加密庫將為加密整個過程提供開箱即用的加密安全性。 你無需擔(dān)心。
上面的示例將使用 app/Config/Encryption.php
中的配置設(shè)置。
它只有兩個設(shè)置選項
選項 | 可能的值 |
---|---|
key | 加密 |
啟動器 | |
driver | 首選加密程序 (默認(rèn)為OpenSSL) |
你可以通過將自己的配置對象傳遞給 Services
調(diào)用來替換配置文件的設(shè)置。 $config
的值必須是 Config\Encryption 類的實例或擴(kuò)展 CodeIgniter\Config\BaseConfig 的實例。
$config = new Config\Encryption();
$config->key = 'aBigsecret_ofAtleast32Characters';
$config->driver = 'OpenSSL';
$encrypter = \Config\Services::encrypter($config);
默認(rèn)情況下,加密庫使用 OpenSSL 加密程序。該處理程序使用 AES-256-CTR 算法、你配置的 密鑰 和SHA512 HMAC身份驗證進(jìn)行加密。
你的加密密鑰的長度 必須 在使用的加密算法允許的范圍內(nèi)。比如對于AES-256來說,則為256位或32個字節(jié)(字符)長度。
密鑰應(yīng)該盡可能隨機(jī),并且不能是常規(guī)文本字符串,也不能是哈希函數(shù)的輸出等。要創(chuàng)建正確的密鑰,可以使用加密庫的 createKey()
方法。
// $key 將被分配一個32字節(jié)(256位)隨機(jī)密鑰
$key = Encryption::createKey(32);
密鑰可以存儲在 app/Config/Encryption.php 中,或者您可以設(shè)計自己的存儲機(jī)制,并在加解密時動態(tài)傳遞密鑰。
要將密鑰保存到 app/Config/Encryption.php ,請打開文件并進(jìn)行以下設(shè)置::
public $key = 'YOUR KEY';
你會注意到 createKey()
方法會輸出二進(jìn)制數(shù)據(jù),這是很難解決(即復(fù)制粘貼可能會損壞), 所以你可以使用 bin2hex()
、 hex2bin()
或編碼的 Base64
處理以更友好的密鑰。例如::
// 獲取一個十六進(jìn)制形式的密鑰
$encoded = bin2hex(Encryption::createKey(32));
// 使用 hex2bin() 將相同的值放入配置中,
// 這樣它仍會以二進(jìn)制形式傳遞給庫配置:
$key = hex2bin(<your hex-encoded key>);
你可能會發(fā)現(xiàn)相同的技術(shù)對于加密結(jié)果也是有效的::
// Encrypt some text & make the results text
// 加密一些文本并生成密文
$encoded = base64_encode($encrypter->encrypt($plaintext));
一直以來, OpenSSL 擴(kuò)展一直是PHP的標(biāo)配。
CodeIgniter的OpenSSL處理程序使用AES-256-CTR算法。
你的配置提供的 密鑰 用于派生另外兩個密鑰,一個用于加密,另一個用于身份驗證。 這是通過一種叫做 基于HMAC的密鑰派生函數(shù)(HKDF)的技術(shù)來實現(xiàn)的。
加密后的字符串通常長于原始的純文本字符串(取決于算法)。
這受密碼算法本身影響,初始化因子(IV)以及HMAC身份驗證消息也會加在密碼文本之前。 此外,加密的消息也會經(jīng)過Base64編碼,因此無論使用什么字符集,它都可以安全地存儲和傳輸。
但是選擇數(shù)據(jù)存儲機(jī)制時,請記住,Cookie只能保存4K信息。
除了使用 使用加密類庫 中 Services
那樣的方法外,你還可以直接創(chuàng)建“加密器”,或更改現(xiàn)有實例的設(shè)置。
// create an Encrypter instance
// 創(chuàng)建一個加密器實例
$encryption = new \Encryption\Encryption();
// reconfigure an instance with different settings
// 用不同的設(shè)置重新配置實例
$encrypter = $encryption->initialize($config);
請記住, $config
必須是 ConfigEncryption 類或擴(kuò)展 CodeIgniterConfigBaseConfig 類的實例。
CodeIgniter\Encryption\Encryption
staticcreateKey
($length)
參數(shù): | $length (int) – 輸出密鑰的長度 |
---|---|
返回: | 具有指定長度的隨機(jī)密碼密鑰,創(chuàng)建失敗則為FALSE |
返回類型: | string |
通過從操作系統(tǒng)的源(即/dev/urandom)獲取隨機(jī)數(shù)據(jù)來創(chuàng)建加密密鑰。
initialize
($config)
參數(shù): | $config (BaseConfig) – Configuration parameters |
---|---|
返回: | CodeIgniter\Encryption\EncrypterInterface instance |
返回類型: | CodeIgniter\Encryption\EncrypterInterface |
Throws: | CodeIgniter\Encryption\EncryptionException |
初始化(或配置)庫以使用不同的設(shè)置。
例:
$encrypter = $encryption->initialize(['cipher' => '3des']);
請參閱 配置加密類庫部分以獲取詳細(xì)信息。
CodeIgniter\Encryption\EncrypterInterface
encrypt
($data, $params = null)
參數(shù): | $data (string) – 要加密的數(shù)據(jù) |
---|---|
$params – 配置參數(shù)(或鍵) | |
返回: | 加密后的數(shù)據(jù),加密失敗時返回FALSE |
返回類型: | string |
Throws: | CodeIgniter\Encryption\EncryptionException |
加密輸入數(shù)據(jù)并返回其密文。
將配置參數(shù)作為第二個參數(shù)傳遞時,如果 $params
是數(shù)組, 則 密鑰
將用作這次加密的起始鍵; 或者也可以把這次加密的密鑰作為字符串傳遞。
例:
$ciphertext = $encrypter->encrypt('My secret message');
$ciphertext = $encrypter->encrypt('My secret message', ['key' => 'New secret key']);
$ciphertext = $encrypter->encrypt('My secret message', 'New secret key');
decrypt
($data, $params = null)
參數(shù): | $data (string) – 要解密的數(shù)據(jù) |
---|---|
$params – 配置參數(shù)(或鍵) | |
返回: | 解密后的數(shù)據(jù),解密失敗時返回FALSE |
返回類型: | string |
Throws: | CodeIgniter\Encryption\EncryptionException |
加密輸入數(shù)據(jù)并返回其密文。
將配置參數(shù)作為第二個參數(shù)傳遞時,如果 $params
是數(shù)組, 則 密鑰
將用作這次解密的起始鍵; 或者也可以把這次解密的密鑰作為字符串傳遞。
例:
echo $encrypter->decrypt($ciphertext);
echo $encrypter->decrypt($ciphertext, ['key' => 'New secret key']);
echo $encrypter->decrypt($ciphertext, 'New secret key');
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: