CodeIgniter4 加密服務(wù)

2020-08-17 16:54 更新

重要

請勿使任何 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)行為

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

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

你會注意到 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 說明

一直以來, 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信息。

直接使用加密服務(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 類或擴(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');
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號