加密服務(wù)?
重要
請勿使任何 encryption 庫來存儲密碼! 密碼必須使用 散列 ,而你應(yīng)該通過 PHP的密碼散列擴展 進行散列 。
加密服務(wù)提供雙向?qū)ΨQ(密鑰)數(shù)據(jù)加密。該服務(wù)將實例化或初始化 加密程序 以適配你的參數(shù),如下所述。
加密處理程序必須實現(xiàn)CodeIgniter的 EncrypterInterface
接口 。使用 PHP 密碼擴展或其它第三方庫可能需要在服務(wù)器上安裝其他軟件,
并且可能需要在 PHP 實例啟用。
支持以下拓展:
這并不是一套完整的密碼解決方案。如果您需要更多功能(例如公鑰加密),建議你考慮直接使用 OpenSSL 或其他 密碼學(xué)擴展 。 還有一種更全面的軟件包,例如 Halite (基于libsodium構(gòu)建的 O-O 軟件包)。
注解
自從PHP 7.2起就已棄用了對 MCrypt
擴展的支持。
使用加密類庫?
就像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 | 首選加密程序 (默認為OpenSSL) |
你可以通過將自己的配置對象傳遞給 Services
調(diào)用來替換配置文件的設(shè)置。
$config
的值必須是 Config\Encryption 類的實例或擴展 CodeIgniter\Config\BaseConfig 的實例。
$config = new Config\Encryption();
$config->key = 'aBigsecret_ofAtleast32Characters';
$config->driver = 'OpenSSL';
$encrypter = \Config\Services::encrypter($config);
配置你的密鑰?
你的加密密鑰的長度 必須 在使用的加密算法允許的范圍內(nèi)。比如對于AES-256來說,則為256位或32個字節(jié)(字符)長度。
密鑰應(yīng)該盡可能隨機,并且不能是常規(guī)文本字符串,也不能是哈希函數(shù)的輸出等。要創(chuàng)建正確的密鑰,可以使用加密庫的 createKey()
方法。
// $key 將被分配一個32字節(jié)(256位)隨機密鑰
$key = Encryption::createKey(32);
密鑰可以存儲在 app/Config/Encryption.php 中,或者您可以設(shè)計自己的存儲機制,并在加解密時動態(tài)傳遞密鑰。
要將密鑰保存到 app/Config/Encryption.php ,請打開文件并進行以下設(shè)置::
public $key = 'YOUR KEY';
對密鑰或結(jié)果編碼?
你會注意到 createKey()
方法會輸出二進制數(shù)據(jù),這是很難解決(即復(fù)制粘貼可能會損壞),
所以你可以使用 bin2hex()
、 hex2bin()
或編碼的 Base64
處理以更友好的密鑰。例如::
// 獲取一個十六進制形式的密鑰
$encoded = bin2hex(Encryption::createKey(32));
// 使用 hex2bin() 將相同的值放入配置中,
// 這樣它仍會以二進制形式傳遞給庫配置:
$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 說明?
一直以來, OpenSSL 擴展一直是PHP的標(biāo)配。
CodeIgniter的OpenSSL處理程序使用AES-256-CTR算法。
你的配置提供的 密鑰 用于派生另外兩個密鑰,一個用于加密,另一個用于身份驗證。 這是通過一種叫做 基于HMAC的密鑰派生函數(shù) (HKDF)的技術(shù)來實現(xiàn)的。
消息長度?
加密后的字符串通常長于原始的純文本字符串(取決于算法)。
這受密碼算法本身影響,初始化因子(IV)以及HMAC身份驗證消息也會加在密碼文本之前。 此外,加密的消息也會經(jīng)過Base64編碼,因此無論使用什么字符集,它都可以安全地存儲和傳輸。
但是選擇數(shù)據(jù)存儲機制時,請記住,Cookie只能保存4K信息。
直接使用加密服務(wù)?
除了使用 使用加密類庫 中 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 類或擴展 CodeIgniterConfigBaseConfig 類的實例。
類參考?
-
CodeIgniter\Encryption\Encryption
-
static
createKey
($length)? 參數(shù): - $length (int) – 輸出密鑰的長度
返回: 具有指定長度的隨機密碼密鑰,創(chuàng)建失敗則為FALSE
返回類型: string
通過從操作系統(tǒng)的源(即/dev/urandom)獲取隨機數(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']);
請參閱 配置加密類庫 部分以獲取詳細信息。
-
static
-
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');
-