CodeIgniter4 加密服務(wù)

2020-08-17 16:54 更新

重要

請(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ò)展的支持。

使用加密類(lèi)庫(kù)

就像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)心。

配置加密類(lèi)庫(kù)

上面的示例將使用 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)行為

默認(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';

對(duì)密鑰或結(jié)果編碼

你會(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));

加密處理程序說(shuō)明

OpenSSL 說(shuō)明

一直以來(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)度

加密后的字符串通常長(zhǎng)于原始的純文本字符串(取決于算法)。

這受密碼算法本身影響,初始化因子(IV)以及HMAC身份驗(yàn)證消息也會(huì)加在密碼文本之前。 此外,加密的消息也會(huì)經(jīng)過(guò)Base64編碼,因此無(wú)論使用什么字符集,它都可以安全地存儲(chǔ)和傳輸。

但是選擇數(shù)據(jù)存儲(chǔ)機(jī)制時(shí),請(qǐng)記住,Cookie只能保存4K信息。

直接使用加密服務(wù)

除了使用 使用加密類(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í)例。

類(lèi)參考

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');
以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)