CodeIgniter 加密類(新版)

2018-07-21 15:39 更新

加密類(新版)

重要

絕不要使用這個(gè)類或其他任何加密類來進(jìn)行密碼處理!密碼應(yīng)該是被哈希, 你應(yīng)該使用 PHP 自帶的 密碼哈希擴(kuò)展 。

加密類提供了雙向數(shù)據(jù)加密的方式,為了實(shí)現(xiàn)密碼學(xué)意義上的安全,它使用了一些并非在所有系統(tǒng)上都可用的 PHP 的擴(kuò)展, 要使用這個(gè)類,你的系統(tǒng)上必須安裝了下面的擴(kuò)展:

  • OpenSSL (以及 PHP 5.3.3)
  • MCrypt (要支持 MCRYPT_DEV_URANDOM)

只要有一點(diǎn)不滿足,我們就無法為你提供足夠高的安全性。

使用加密類

初始化類

正如 CodeIgniter 中的其他類一樣,在你的控制器中使用 $this->load->library() 方法來初始化加密類:

$this->load->library('encryption');

初始化之后,加密類的對(duì)象就可以這樣訪問:

$this->encryption

默認(rèn)行為

默認(rèn)情況下,加密類會(huì)通過你配置的 encryption_key 參數(shù)和 SHA512 HMAC 認(rèn)證, 使用 AES-128 算法的 CBC 模式。

注解

選擇使用 AES-128 算法不僅是因?yàn)樗呀?jīng)被證明相當(dāng)強(qiáng)壯, 而且它也已經(jīng)在不同的加密軟件和編程語(yǔ)言 API 中廣泛的使用了。

但是要注意的是,encryption_key 參數(shù)的用法可能并不是你想的那樣。

如果你對(duì)密碼學(xué)有點(diǎn)熟悉的話,你應(yīng)該知道,使用 HMAC 算法認(rèn)證也需要使用一個(gè)密鑰, 而在加密的過程和認(rèn)證的過程中使用相同的密鑰可不是個(gè)好的做法。

正因?yàn)榇耍绦驎?huì)從你的配置的 encryption_key 參數(shù)中派生出兩個(gè)密鑰來: 一個(gè)用于加密,另一個(gè)用于認(rèn)證。這其實(shí)是通過一種叫做 HKDF (HMAC-based Key Derivation Function)的技術(shù)實(shí)現(xiàn)的。

設(shè)置 encryption_key 參數(shù)

加密密鑰( encryption key )是用于控制加密過程的一小段信息,使用它可以對(duì)普通文本進(jìn)行加密和解密。

這個(gè)過程可以保證只有你能對(duì)數(shù)據(jù)進(jìn)行解密,其他人是看不到你的數(shù)據(jù)的,這其中的關(guān)鍵就是 加密密鑰。 如果你使用了一個(gè)密鑰來加密數(shù)據(jù),那么就只能通過這個(gè)密鑰來解密,所以你不僅應(yīng)該仔細(xì)選擇你的密鑰, 還應(yīng)該好好的保管好它,不要忘記了。

還有一點(diǎn)要注意的是,為了確保最高的安全性,這個(gè)密鑰不僅 應(yīng)該 越強(qiáng)壯越好,而且 應(yīng)該 經(jīng)常修改。 不過這在現(xiàn)實(shí)中很難做到,也不好實(shí)現(xiàn),所以 CodeIgniter 提供了一個(gè)配置參數(shù)用于設(shè)置你的密鑰, 這個(gè)密鑰(幾乎)每次都會(huì)用到。

不用說,你應(yīng)該小心保管好你的密鑰,如果有人得到了你的密鑰,那么數(shù)據(jù)就能很容易的被解密。 如果你的服務(wù)器不在你的控制之下,想保證你的密鑰絕對(duì)安全是不可能的, 所以在在你使用密鑰對(duì)敏感數(shù)據(jù)(譬如信用卡號(hào)碼)進(jìn)行加密之前,請(qǐng)?jiān)偃遄谩?/p>

你的加密密鑰的長(zhǎng)度 必須 滿足正在使用的加密算法允許的長(zhǎng)度。例如,AES-128 算法最長(zhǎng)支持 128 位(16 字節(jié))。下面有一個(gè)表列出了不同算法支持的密鑰長(zhǎng)度。

你所使用的密鑰應(yīng)該越隨機(jī)越好,它不能是一個(gè)普通的文本字符串,經(jīng)過哈希函數(shù)處理過也不行。 為了生成一個(gè)合適的密鑰,你應(yīng)該使用加密類提供的create_key() 方法:

// $key will be assigned a 16-byte (128-bit) random key
$key = $this->encryption->create_key(16);

密鑰可以保存在 application/config/config.php 配置文件中,或者你也可以設(shè)計(jì)你自己的存儲(chǔ)機(jī)制, 然后加密解密的時(shí)候動(dòng)態(tài)的去獲取它。

如果要保存在配置文件 application/config/config.php 中,可以打開該文件,然后設(shè)置:

$config['encryption_key'] = 'YOUR KEY';

你會(huì)發(fā)現(xiàn) create_key() 方法返回的是二進(jìn)制數(shù)據(jù),沒辦法復(fù)制粘貼,所以你可能還需要使用 bin2hex() 、 hex2bin() 或 Base64 編碼來更好的處理密鑰數(shù)據(jù)。例如:

// Get a hex-encoded representation of the key:
$key = bin2hex($this->encryption->create_key(16));

// Put the same value in your config with hex2bin(),
// so that it is still passed as binary to the library:
$config['encryption_key'] = hex2bin(<your hex-encoded key>);

支持的加密算法和模式

可移植的算法(Portable ciphers)

因?yàn)?MCrypt 和 OpenSSL (我們也稱之為“驅(qū)動(dòng)”)支持的加密算法不同,而且實(shí)現(xiàn)方式也不太一樣, CodeIgniter 將它們?cè)O(shè)計(jì)成一種可移植的方式來使用,換句話說,你可以交換使用它們兩個(gè), 至少對(duì)它們兩個(gè)驅(qū)動(dòng)都支持的算法來說是這樣。

而且 CodeIgniter 的實(shí)現(xiàn)也和其他編程語(yǔ)言和類庫(kù)的標(biāo)準(zhǔn)實(shí)現(xiàn)一致。

下面是可移植算法的清單,其中 "CodeIgniter 名稱" 一欄就是你在使用加密類的時(shí)候使用的名稱:

算法名稱 CodeIgniter 名稱 密鑰長(zhǎng)度 (位 / 字節(jié)) 支持的模式
AES-128 / Rijndael-128 aes-128 128 / 16 CBC, CTR, CFB, CFB8, OFB, ECB
AES-192 aes-192 192 / 24 CBC, CTR, CFB, CFB8, OFB, ECB
AES-256 aes-256 256 / 32 CBC, CTR, CFB, CFB8, OFB, ECB
DES des 56 / 7 CBC, CFB, CFB8, OFB, ECB
TripleDES tripledes 56 / 7, 112 / 14, 168 / 21 CBC, CFB, CFB8, OFB
Blowfish blowfish 128-448 / 16-56 CBC, CFB, OFB, ECB
CAST5 / CAST-128 cast5 88-128 / 11-16 CBC, CFB, OFB, ECB
RC4 / ARCFour rc4 40-2048 / 5-256 Stream

重要

由于 MCrypt 的內(nèi)部實(shí)現(xiàn),如果你提供了一個(gè)長(zhǎng)度不合適的密鑰,它會(huì)使用另一種不同的算法來加密, 這將和你配置的算法不一致,所以要特別注意這一點(diǎn)!

注解

上表中還有一點(diǎn)要澄清,Blowfish、CAST5 和 RC4 算法支持可變長(zhǎng)度的密鑰,也就是說, 只要密鑰的長(zhǎng)度在指定范圍內(nèi)都是可以的。

注解

盡管 CAST5 支持的密鑰的長(zhǎng)度可以小于 128 位(16 字節(jié)),其實(shí)實(shí)際上,根據(jù) RFC 2144 我們知道,它會(huì)用 0 進(jìn)行補(bǔ)齊到最大長(zhǎng)度。

注解

Blowfish 算法支持最短 32 位(4 字節(jié))的密鑰,但是經(jīng)過我們的測(cè)試發(fā)現(xiàn),只有密鑰長(zhǎng)度大于等于 128 位(16 字節(jié)) 時(shí),才可以很好的同時(shí)支持 MCrypt 和 OpenSSL ,再說,設(shè)置這么短的密鑰也不是好的做法。

特定驅(qū)動(dòng)的算法(Driver-specific ciphers)

正如前面所說,MCrypt 和 OpenSSL 支持不同的加密算法,所以你也可以選擇下面這些只針對(duì)某一特定驅(qū)動(dòng)的算法。 但是為了移植性考慮,而且這些算法也沒有經(jīng)過徹底測(cè)試,我們并不建議你使用這些算法。

算法名稱 驅(qū)動(dòng) 密鑰長(zhǎng)度 (位 / 字節(jié)) 支持的模式
AES-128 OpenSSL 128 / 16 CBC, CTR, CFB, CFB8, OFB, ECB, XTS
AES-192 OpenSSL 192 / 24 CBC, CTR, CFB, CFB8, OFB, ECB, XTS
AES-256 OpenSSL 256 / 32 CBC, CTR, CFB, CFB8, OFB, ECB, XTS
Rijndael-128 MCrypt 128 / 16, 192 / 24, 256 / 32 CBC, CTR, CFB, CFB8, OFB, OFB8, ECB
Rijndael-192 MCrypt 128 / 16, 192 / 24, 256 / 32 CBC, CTR, CFB, CFB8, OFB, OFB8, ECB
Rijndael-256 MCrypt 128 / 16, 192 / 24, 256 / 32 CBC, CTR, CFB, CFB8, OFB, OFB8, ECB
GOST MCrypt 256 / 32 CBC, CTR, CFB, CFB8, OFB, OFB8, ECB
Twofish MCrypt 128 / 16, 192 / 24, 256 / 32 CBC, CTR, CFB, CFB8, OFB, OFB8, ECB
CAST-128 MCrypt 40-128 / 5-16 CBC, CTR, CFB, CFB8, OFB, OFB8, ECB
CAST-256 MCrypt 128 / 16, 192 / 24, 256 / 32 CBC, CTR, CFB, CFB8, OFB, OFB8, ECB
Loki97 MCrypt 128 / 16, 192 / 24, 256 / 32 CBC, CTR, CFB, CFB8, OFB, OFB8, ECB
SaferPlus MCrypt 128 / 16, 192 / 24, 256 / 32 CBC, CTR, CFB, CFB8, OFB, OFB8, ECB
Serpent MCrypt 128 / 16, 192 / 24, 256 / 32 CBC, CTR, CFB, CFB8, OFB, OFB8, ECB
XTEA MCrypt 128 / 16 CBC, CTR, CFB, CFB8, OFB, OFB8, ECB
RC2 MCrypt 8-1024 / 1-128 CBC, CTR, CFB, CFB8, OFB, OFB8, ECB
RC2 OpenSSL 8-1024 / 1-128 CBC, CFB, OFB, ECB
Camellia-128 OpenSSL 128 / 16 CBC, CFB, CFB8, OFB, ECB
Camellia-192 OpenSSL 192 / 24 CBC, CFB, CFB8, OFB, ECB
Camellia-256 OpenSSL 256 / 32 CBC, CFB, CFB8, OFB, ECB
Seed OpenSSL 128 / 16 CBC, CFB, OFB, ECB

注解

如果你要使用這些算法,你只需將它的名稱以小寫形式傳遞給加密類即可。

注解

你可能已經(jīng)注意到,所有的 AES 算法(以及 Rijndael-128 算法)也在上面的可移植算法列表中出現(xiàn)了, 這是因?yàn)檫@些算法支持不同的模式。還有很重要的一點(diǎn)是,在使用 128 位的密鑰時(shí),AES-128 和 Rijndael-128 算法其實(shí)是一樣的。

注解

CAST-128 / CAST-5 算法也在兩個(gè)表格都出現(xiàn)了,這是因?yàn)楫?dāng)密鑰長(zhǎng)度小于等于 80 位時(shí), OpenSSL 的實(shí)現(xiàn)貌似有問題。

注解

列表中可以看到 RC2 算法同時(shí)被 MCrypt 和 OpenSSL 支持,但是兩個(gè)驅(qū)動(dòng)對(duì)它的實(shí)現(xiàn)方式是不一樣的, 而且也是不能移植的。我們只找到了一條關(guān)于這個(gè)的不確定的消息可能是 MCrypt 的實(shí)現(xiàn)有問題。

加密模式

加密算法的不同模式有著不同的特性,它們有著不同的目的,有的可能比另一些更強(qiáng)壯,有的可能速度更快, 有的可能提供了額外的功能。 我們并不打算深入研究這個(gè),這應(yīng)該是密碼學(xué)專家做的事。下表將向我們普通的用戶列出一些簡(jiǎn)略的參考信息。 如果你是個(gè)初學(xué)者,直接使用 CBC 模式就可以了,一般情況下它已經(jīng)足夠強(qiáng)壯和安全,并且已經(jīng)被廣泛接受。

模式名稱 CodeIgniter 名稱 支持的驅(qū)動(dòng) 備注
CBC cbc MCrypt, OpenSSL 安全的默認(rèn)選擇
CTR ctr MCrypt, OpenSSL 理論上比 CBC 更好,但并沒有廣泛使用
CFB cfb MCrypt, OpenSSL N/A
CFB8 cfb8 MCrypt, OpenSSL 和 CFB 一樣,但是使用 8 位模式(不推薦)
OFB ofb MCrypt, OpenSSL N/A
OFB8 ofb8 MCrypt 和 OFB 一樣,但是使用 8 位模式(不推薦)
ECB ecb MCrypt, OpenSSL 忽略 IV (不推薦)
XTS xts OpenSSL 通常用來加密可隨機(jī)訪問的數(shù)據(jù),如 RAM 或 硬盤
Stream stream MCrypt, OpenSSL 這其實(shí)并不是一種模式,只是表明使用了流加密,通常在 算法+模式 的初始化過程中會(huì)用到。

消息長(zhǎng)度

有一點(diǎn)對(duì)你來說可能很重要,加密的字符串通常要比原始的文本字符串要長(zhǎng)(取決于算法)。

這個(gè)會(huì)取決于加密所使用的算法,添加到密文上的 IV ,以及添加的 HMAC 認(rèn)證信息。 另外,為了保證傳輸?shù)陌踩裕用芟⑦€會(huì)被 Base64 編碼。

當(dāng)你選擇數(shù)據(jù)保存機(jī)制時(shí)請(qǐng)記住這一點(diǎn),譬如 Cookie 只能存儲(chǔ) 4k 的信息。

配置類庫(kù)

考慮到可用性,性能,以及一些歷史原因,加密類使用了和老的 加密類 一樣的驅(qū)動(dòng)、 加密算法、模式 和 密鑰。

上面的 "默認(rèn)行為" 一節(jié)已經(jīng)提到,系統(tǒng)將自動(dòng)檢測(cè)驅(qū)動(dòng)(OpenSSL 優(yōu)先級(jí)要高點(diǎn)),使用 CBC 模式的 AES-128 算法,以及$config['encryption_key'] 參數(shù)。

如果你想改變這點(diǎn),你需要使用 initialize() 方法,它的參數(shù)為一個(gè)關(guān)聯(lián)數(shù)組,每一項(xiàng)都是可選:

選項(xiàng) 可能的值
driver 'mcrypt', 'openssl'
cipher 算法名稱(參見 支持的加密算法和模式
mode 加密模式(參見 加密模式
key 加密密鑰

例如,如果你想將加密算法和模式改為 AES-126 CTR ,可以這樣:

$this->encryption->initialize(
    array(
        'cipher' => 'aes-256',
        'mode' => 'ctr',
        'key' => '<a 32-character random string>'
    )
);

另外,我們也可以設(shè)置一個(gè)密鑰,如前文所說,針對(duì)所使用的算法選擇一個(gè)合適的密鑰非常重要。

我們還可以修改驅(qū)動(dòng),如果你兩種驅(qū)動(dòng)都支持,但是出于某種原因你想使用 MCrypt 來替代 OpenSSL

// Switch to the MCrypt driver
$this->encryption->initialize(array('driver' => 'mcrypt'));

// Switch back to the OpenSSL driver
$this->encryption->initialize(array('driver' => 'openssl'));

對(duì)數(shù)據(jù)進(jìn)行加密與解密

使用已配置好的參數(shù)來對(duì)數(shù)據(jù)進(jìn)行加密和解密是非常簡(jiǎn)單的,你只要將字符串傳給 encrypt() 和/或 decrypt() 方法即可:

$plain_text = 'This is a plain-text message!';
$ciphertext = $this->encryption->encrypt($plain_text);

// Outputs: This is a plain-text message!
echo $this->encryption->decrypt($ciphertext);

這樣就行了!加密類會(huì)為你完成所有必須的操作并確保安全,你根本不用關(guān)系細(xì)節(jié)。

重要

兩個(gè)方法在遇到錯(cuò)誤時(shí)都會(huì)返回 FALSE ,如果是 encrypt() 返回 FALSE , 那么只可能是配置參數(shù)錯(cuò)了。在生產(chǎn)代碼中一定要對(duì) decrypt() 方法進(jìn)行檢查。

實(shí)現(xiàn)原理

如果你非要知道整個(gè)過程的實(shí)現(xiàn)步驟,下面是內(nèi)部的實(shí)現(xiàn):

  • $this->encryption->encrypt($plain_text)
    1. 通過 HKDF 和 SHA-512 摘要算法,從你配置的 encryption_key 參數(shù)中獲取兩個(gè)密鑰:加密密鑰 和 HMAC 密鑰。
    2. 生成一個(gè)隨機(jī)的初始向量(IV)。
    3. 使用上面的加密密鑰和 IV ,通過 AES-128 算法的 CBC 模式(或其他你配置的算法和模式)對(duì)數(shù)據(jù)進(jìn)行加密。
    4. 將 IV 附加到密文后。
    5. 對(duì)結(jié)果進(jìn)行 Base64 編碼,這樣就可以安全的保存和傳輸它,而不用擔(dān)心字符集問題。
    6. 使用 HMAC 密鑰生成一個(gè) SHA-512 HMAC 認(rèn)證消息,附加到 Base64 字符串后,以保證數(shù)據(jù)的完整性。
  • $this->encryption->decrypt($ciphertext)
    1. 通過 HKDF 和 SHA-512 摘要算法,從你配置的 encryption_key 參數(shù)中獲取兩個(gè)密鑰:加密密鑰 和 HMAC 密鑰。 由于 encryption_key 不變,所以生成的結(jié)果和上面 encrypt() 方法生成的結(jié)果是一樣的,否則你沒辦法解密。
    2. 檢查字符串的長(zhǎng)度是否足夠長(zhǎng),并從字符串中分離出 HMAC ,然后驗(yàn)證是否一致(這可以防止時(shí)序攻擊(timing attack)), 如果驗(yàn)證失敗,返回 FALSE 。
    3. 進(jìn)行 Base64 解碼。
    4. 從密文中分離出 IV ,并使用 IV 和 加密密鑰對(duì)數(shù)據(jù)進(jìn)行解密。

使用自定義參數(shù)

假設(shè)你需要和另一個(gè)系統(tǒng)交互,這個(gè)系統(tǒng)不受你的控制,而且它使用了其他的方法來加密數(shù)據(jù), 加密的方式和我們上面介紹的流程不一樣。

在這種情況下,加密類允許你修改它的加密和解密的流程,這樣你就可以簡(jiǎn)單的調(diào)整成自己的解決方案。

注解

通過這種方式,你可以不用在配置文件中配置 encryption_key 就能使用加密類。

你所需要做的就是傳一個(gè)包含一些參數(shù)的關(guān)聯(lián)數(shù)組到 encrypt() 或 decrypt() 方法,下面是個(gè)例子:

// Assume that we have $ciphertext, $key and $hmac_key
// from on outside source

$message = $this->encryption->decrypt(
    $ciphertext,
    array(
        'cipher' => 'blowfish',
        'mode' => 'cbc',
        'key' => $key,
        'hmac_digest' => 'sha256',
        'hmac_key' => $hmac_key
    )
);

在上面的例子中,我們對(duì)一段使用 CBC 模式的 Blowfish 算法加密的消息進(jìn)行解密,并使用 SHA-256 HMAC 認(rèn)證方式。

重要

注意在這個(gè)例子中 'key' 和 'hmac_key' 參數(shù)都要指定,當(dāng)使用自定義參數(shù)時(shí),加密密鑰和 HMAC 密鑰 不再是默認(rèn)的那樣從配置參數(shù)中自動(dòng)獲取的了。

下面是所有可用的選項(xiàng)。

但是,除非你真的需要這樣做,并且你知道你在做什么,否則我們建議你不要修改加密的流程,因?yàn)檫@會(huì)影響安全性, 所以請(qǐng)謹(jǐn)慎對(duì)待。

選項(xiàng) 默認(rèn)值 必須的 / 可選的 描述
cipher N/A Yes 加密算法(參見 支持的加密算法和模式
mode N/A Yes 加密模式(參見 加密模式
key N/A Yes 加密密鑰
hmac TRUE No 是否使用 HMAC 布爾值,如果為 FALSE ,hmac_digest 和 hmac_key 將被忽略
hmac_digest sha512 No HMAC 消息摘要算法(參見 支持的 HMAC 認(rèn)證算法
hmac_key N/A Yes,除非 hmac 設(shè)為 FALSE HMAC 密鑰
raw_data FALSE No 加密文本是否保持原樣 布爾值,如果為 TRUE ,將不執(zhí)行 Base64 編碼和解碼操作 HMAC 也不會(huì)是十六進(jìn)制字符串

重要

encrypt() and decrypt() will return FALSE if a mandatory parameter is not provided or if a provided value is incorrect. This includeshmac_key, unless hmac is set to FALSE.

支持的 HMAC 認(rèn)證算法

對(duì)于 HMAC 消息認(rèn)證,加密類支持使用 SHA-2 家族的算法:

算法 原始長(zhǎng)度(字節(jié)) 十六進(jìn)制編碼長(zhǎng)度(字節(jié))
sha512 64 128
sha384 48 96
sha256 32 64
sha224 28 56

之所以沒有包含一些其他的流行算法,譬如 MD5 或 SHA1 ,是因?yàn)檫@些算法目前已被證明不夠安全, 我們并不鼓勵(lì)使用它們。如果你非要使用這些算法,簡(jiǎn)單的使用 PHP 的原生函數(shù) hash_hmac() 也可以。

當(dāng)未來出現(xiàn)廣泛使用的更好的算法時(shí),我們自然會(huì)將其添加進(jìn)去。

類參考

classCI_Encryption

initialize($params)

參數(shù):

  • $params (array) -- Configuration parameters

返回: CI_Encryption instance (method chaining)

返回類型: CI_Encryption

初始化加密類的配置,使用不同的驅(qū)動(dòng),算法,模式 或 密鑰。

例如:

$this->encryption->initialize(
    array('mode' => 'ctr')
);

請(qǐng)參考 配置類庫(kù) 一節(jié)了解詳細(xì)信息。

encrypt($data[, $params = NULL])

參數(shù):

  • $data (string) -- Data to encrypt
  • $params (array) -- Optional parameters

返回: Encrypted data or FALSE on failure

返回類型: string

對(duì)輸入數(shù)據(jù)進(jìn)行加密,并返回密文。

例如:

$ciphertext = $this->encryption->encrypt('My secret message');

請(qǐng)參考 使用自定義參數(shù) 一節(jié)了解更多參數(shù)信息。

decrypt($data[, $params = NULL])

參數(shù):

  • $data (string) -- Data to decrypt
  • $params (array) -- Optional parameters

返回: Decrypted data or FALSE on failure

返回類型: string

對(duì)輸入數(shù)據(jù)進(jìn)行解密,并返回解密后的文本。

例如:

echo $this->encryption->decrypt($ciphertext);

請(qǐng)參考 使用自定義參數(shù) 一節(jié)了解更多參數(shù)信息。

create_key($length)

參數(shù):

  • $length (int) -- Output length

返回: A pseudo-random cryptographic key with the specified length, or FALSE on failure

返回類型: string

從操作系統(tǒng)獲取隨機(jī)數(shù)據(jù)(例如 /dev/urandom),并生成加密密鑰。

hkdf($key[, $digest = 'sha512'[, $salt = NULL[, $length = NULL[, $info = '']]]])

參數(shù):

  • $key (string) -- Input key material
  • $digest (string) -- A SHA-2 family digest algorithm
  • $salt (string) -- Optional salt
  • $length (int) -- Optional output length
  • $info (string) -- Optional context/application-specific info

返回: A pseudo-random key or FALSE on failure

返回類型: string

從一個(gè)密鑰生成另一個(gè)密鑰(較弱的密鑰)。

這是內(nèi)部使用的一個(gè)方法,用于從配置的 encryption_key 參數(shù)生成一個(gè)加密密鑰和 HMAC 密鑰。

將這個(gè)方法公開,是為了可能會(huì)在其他地方使用到。關(guān)于這個(gè)算法的描述可以看 RFC 5869 。

和 RFC 5869 描述不同的是,這個(gè)方法不支持 SHA1 。

例如:

$hmac_key = $this->encryption->hkdf(
    $key,
    'sha512',
    NULL,
    NULL,
    'authentication'
);

// $hmac_key is a pseudo-random key with a length of 64 bytes
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)