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