crypt, crypt_r -
パスワードとデータの暗号化
#define _XOPEN_SOURCE /* feature_test_macros(7) 参照 */
#include <unistd.h>
char *crypt(const char *key, const char *salt);
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <crypt.h>
char *crypt_r(const char *key, const char *salt,
struct crypt_data *data);
-lcrypt でリンクする。
crypt()
はパスワード暗号化関数である。
鍵探索のハードウェアによる実装を妨げるように(その他にもいろいろ)
変更した Data Encryption Standard
アルゴリズムを元にしている。
key
はユーザが入力するパスワードである。
salt は集合 [
a-zA-Z0-9./]
から選ばれた 2
文字の文字列である。
この文字列はアルゴリズムの出力を
4096
通りにかき乱すのに使われる。
key の最初の 8
文字の各文字から下位
7 ビットをとって 56
ビットの鍵が得られる。
この 56
ビットの鍵は特定の文字列(ふつうはすべて
0 の文字列)
を繰り返し暗号化するのに用いられる。
返り値は暗号化されたパスワードへのポインタで、13
の印字可能な ASCII 文字
からなる(最初の 2
文字は salt そのもの)。
返り値は、関数呼出しのたびに上書きされる静的なデータへのポインタである。
警告: 鍵空間は 2**56 = 7.2e16
の可能な値から成る。
この鍵空間の全探索は強力な並列計算機を使えば可能である。また
crack(1)
のようなソフトウェアはこの鍵空間の中で、多くの人にパスワードとして
使われるような鍵についての全探索が可能である。
それゆえ、パスワードを選択するときには、すくなくとも、
一般的に使われる単語と名前は避けるべきである。
passwd(1)
を使う時にはクラックされうるパスワードについての検査をすることが
推奨される。
DES
アルゴリズムにはいくつかの癖があり、それによってパスワード認証以外に
crypt()
を使うのはたいへんよくない選択となっている。もし
crypt()
を暗号プロジェクトに使おうという案をもっているならば、それはやめたほうが
よい。暗号化についてのよい本と誰でも入手できる
DES
ライブラリのひとつを
手にいれるべきだ。
crypt_r() は
crypt()
の再入可能版である。
data
で示される構造体は結果データの保存と情報の管理に使われる。
この構造体に対して(メモリを割り当てること以外に)呼び出し元がするべき唯一の
ことは、
crypt_r()
の初回の呼び出しの前に
data->initialized
をゼロにすることだけである。
返り値¶
成功の場合には、暗号化されたパスワードへのポインターが返される。
エラーの場合には NULL
が返される。
エラー¶
- EINVAL
- salt
が間違ったフォーマットである。
- ENOSYS
- crypt()
関数が実装されていない。多分アメリカの輸出規制のために。
- EPERM
- /proc/sys/crypto/fips_enabled が 0
でない値で、 DES
などの弱い暗号タイプを利用しようとした。
マルチスレッディング (pthreads(7) 参照)¶
crypt()
関数はスレッドセーフではない。
crypt_r()
関数はスレッドセーフである。
crypt(): SVr4, 4.3BSD, POSIX.1-2001.
crypt_r() は GNU
拡張である。
glibc での注意¶
この関数の glibc2
版は追加の暗号化アルゴリズムに対応している。
もし
salt の文字列が
"$
id$"
で始まっていて、"$"
で終わっている文字列が
続いている場合:
DES を使う代わりに、
id
で使用する暗号化手法を識別し、これがパスワード文字列の残りの部分を解釈する
方法を決定する。
id
の値として、以下の値に対応している:
ID | Method |
|
|
1 | MD5 |
|
2a | Blowfish (本流の glibc
には入っていない; |
|
| いくつかの Linux
ディストリビューションで追加されている) |
|
. |
|
. |
|
. |
|
. |
|
. |
|
. |
|
5 | SHA-256 (glibc 2.7 以降) |
|
6 | SHA-512 (glibc 2.7 以降) |
|
従って、$5$
salt$
encrypted は
SHA-256
でエンコードされた
パスワードであり、$6$
salt$
encrypted は SHA-512 で
エンコードされたパスワードである。
"
salt" は salt における
"$
id$" に引き続く 16
文字以下の
文字列である。
パスワード文字列の暗号化部分は実際に計算されたパスワードである。
この文字列のサイズは固定である:
MD5 | 22 characters |
|
SHA-256 | 43 characters |
|
SHA-512 | 86 characters |
|
"
salt" と "
encrypted"
の文字は [
a-zA-Z0-9./]
の集合から
選ばれる。 MD5 と SHA
の実装では、
key
全体が意味がある (DES
の場合には最初の 8
文字だけに意味がある)。
関連項目¶
login(1),
passwd(1),
encrypt(3),
getpass(3),
passwd(5)
この文書について¶
この man ページは Linux
man-pages
プロジェクトのリリース
3.65 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。