鍵導出関数
提供: セキュリティ
スポンサーリンク
鍵導出関数 (Key Derivation Function ,KDF)とは、鍵を導出するための関数で、鍵導出アルゴリズムの実装です。鍵導出アルゴリズムは、パスワードを暗号化用の鍵(KEK)に変換するために利用されます。
読み方
- 鍵導出関数
- かぎどうしゅつ かんすう
- Key Derivation Function
- きー でりべーしょん ふぁんくしょん
- KDF
- けー でぃー えふ
- 導出鍵
- どうしゅつ かぎ
目次
概要
鍵導出関数は、パスワード(秘密値)から導出鍵を導出します。導出鍵は、暗号化の暗号鍵として利用できます。
鍵導出
鍵導出(Key Derivation)とは、マスタ鍵と呼ばれる秘密の値から秘密鍵を導出する手法です。導出された秘密鍵は、導出鍵と呼ばれます。 鍵導出では、秘密値を不可逆関数(導出関数)入力して、導出鍵を生成します。
鍵導出関数
- PBKDF1 (Password-Based Key Derivation Function 1)
- PBKDF2
鍵導出関数のパラメータ
鍵導出関数で鍵を求めるためのパラメータには、以下のものがあります。
鍵導出の実装
OpenSSLのライブラリで、鍵導出関数が提供されています。
PHPの場合
- openssl_pbkdf2
- hash_pbkdf2
サンプルコード
PHP openssl_pbkdf2
openssl_pbkdf2は、バイト列を返します。
<?php /** * Short description for openssl_pbkdf2.php * * @package openssl_pbkdf2 * @author kaoru <kaoru@localhost> * @version 0.1 * @copyright (C) 2015 kaoru <kaoru@localhost> */ $algorithm = 'sha512'; $password = '1234'; $salt = openssl_random_pseudo_bytes(64); $count = 10000; $key_length = 64; $key = openssl_pbkdf2($password, $salt, $key_length, $count, $algorithm); echo($key); ?>
$ php openssl_pbkdf2.php | hexdump -C 00000000 23 93 c5 d9 5e 41 08 43 22 7e ea e3 7d d3 67 08 |#...^A.C"~..}.g.| 00000010 73 6d 94 3a 21 9e a8 09 f6 ed 12 bf 53 c0 70 81 |sm.:!.......S.p.| 00000020 46 4c 1f 7e af 9f 9a 80 94 b6 c9 8b 3a 48 38 59 |FL.~........:H8Y| 00000030 75 f5 70 07 20 e0 58 ca 72 b8 a6 6c bc bd dd 41 |u.p. .X.r..l...A| 00000040 $ php openssl_pbkdf2.php | hexdump -C 00000000 e3 0e bb 1b 78 d0 e8 8f 57 23 06 3c 99 c3 8e 7a |....x...W#.<...z| 00000010 15 bf 63 ac 88 9d 5f ca b1 11 3c dc e8 7d 24 53 |..c..._...<..}$S| 00000020 ba 88 b8 8b 26 29 b9 43 a2 cc 67 d4 46 2e ff d9 |....&).C..g.F...| 00000030 49 e7 0e 28 84 61 78 7e 93 f9 61 0e a8 ea c1 0a |I..(.ax~..a.....| 00000040
C言語
#include <openssl/evp.h> #include <openssl/err.h> #include <openssl/rand.h> void pbkdf2 (int count, unsigned char *salt) { int r = 0; unsigned char key [ EVP_MAX_KEY_LENGTH + 1] = { 0 }; unsigned char iv [ EVP_MAX_IV_LENGTH + 1] = { 0 }; unsigned char data [ BUF ] = "pw"; int datal = strlen ( (const char *) data ); r = EVP_BytesToKey ( EVP_aes_256_cbc (), EVP_sha1 (), salt, data, datal, count, key, iv); }
cc -Wall pbkdf2.c -lcrypto
関連項目
ツイート
スポンサーリンク