CRYPT(3) | Linux Programmer's Manual | CRYPT(3) |
名前¶
crypt, crypt_r - パスワードとデータの暗号化
書式¶
#define _XOPEN_SOURCE
#include <unistd.h> char *crypt(const char *key, const char *salt); 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 が返される。
エラー¶
- ENOSYS
- crypt() 関数が実装されていない。多分アメリカの輸出規制のために。
準拠¶
crypt(): SVr4, 4.3BSD, POSIX.1-2001. crypt_r() は GNU 拡張である。
注意¶
glibc での注意¶
この関数の glibc2 版は追加の暗号化アルゴリズムに対応している。
もし salt の文字列が "$id$" で始まっていて、"$" で終わっている文字列が 続いている場合:
$id$salt$encrypted
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./] の集合から 選ばれる。 SHA 実装では、(最初の 8 文字ではなく) キー 全体が意味がある。
関連項目¶
login(1), passwd(1), encrypt(3), getpass(3), passwd(5), feature_test_macros(7)
2008-08-25 |