pgcryptopgcryptoモジュールはPostgreSQL用の暗号関数を提供します。bytea与えられたdataのバイナリハッシュを計算します。typeは使用するアルゴリズムです。標準アルゴリズムはmd5、sha1、sha224、sha256、sha384、およびsha512です。pgcryptoがOpenSSL付きで構築された場合、表F-18で詳解する、より多くのアルゴリズムを利用することができます。ダイジェストを16進数表記の文字列としたい場合は、結果に対してencode()を使用してください。byteakeyをキーとしたdataのハッシュ化MACを計算します。typeはdigest()の場合と同じです。digest()と似ていますが、ハッシュはキーを知っている場合にのみ再計算できます。これは、誰かがデータを変更し、同時に一致するようにハッシュを変更するという状況を防ぎます。キーがハッシュブロックサイズより大きい場合、まずハッシュ化され、その結果をキーとして使用します。パスワードハッシュ化関数crypt()およびgen_salt()関数は特にパスワードのハッシュ化のために設計されたものです。crypt()がハッシュ処理を行い、gen_salt()はハッシュ処理用のアルゴリズム上のパラメータを準備します。crypt()アルゴリズムは、以下の点で通常のMD5やSHA1のようなハッシュ処理アルゴリズムと異なります。データ量が少ないためパスワード総当たり攻撃に対して頑健にする唯一の方法です。結果にはソルトというランダムな値が含まれます。このため同じパスワードのユーザでも異なった暗号化パスワードを持ちます。これはアルゴリズムの逆処理に対する追加の防御です。結果内にアルゴリズムの種類が含まれます。このため異なるアルゴリズムでハッシュ化したパスワードが混在可能です。コンピュータが高速になったとしても、既存のパスワードとの互換性を損なうことなくアルゴリズムを低速に調整することができます。crypt()関数がサポートするアルゴリズムを表F-15に列挙します。textpasswordのcrypt(3)形式のハッシュを計算します。新しいパスワードを保管する時には、gen_salt()を使用して新しいsaltを生成する必要があります。パスワードを検査する時、既存のハッシュ値をsaltとして渡し、結果が格納された値と一致するかどうかを確認します。新しいパスワードの設定例を以下に示します。gen_salt('md5'));認証の例です。;入力パスワードが正しければtrueを返します。textcrypt()で使用するランダムなソルト文字列を新規に生成します。このソルト文字列はcrypt()にどのアルゴリズムを使用するかを通知します。typeパラメータはハッシュ化アルゴリズムを指定します。受付可能な種類は、des、xdes、md5、bfです。繰り返し回数を持つアルゴリズムでは、ユーザはiter_countパラメータを使用して繰り返し回数を指定できます。指定する回数を高くすれば、パスワードのハッシュ化にかかる時間が長くなり、それを破るための時間も長くなります。あまりに多くの回数を指定すると、ハッシュ計算にかかる時間は数年に渡ってしまう可能性があります。これは実用的ではありません。iter_countパラメータを省略した場合、デフォルトの繰り返し回数が使用されます。iter_countで受け付けられる値はアルゴリズムに依存し、表F-16に示す通りです。31xdesの場合は他にも、回数が奇数でなければならないという制限があります。適切な繰り返し回数を選択するために、元々のDES暗号は当時のハードウェアで1秒あたり4個のハッシュを持つことができるように設計されたことを考えてください。毎秒4ハッシュより遅いと、おそらく使い勝手が悪いでしょう。毎秒100ハッシュより速いというのは、十中八九、あまりにも速すぎるでしょう。ハッシュ化アルゴリズム別に相対的な速度に関する概要を表F-17にまとめました。この表は、8文字のパスワード内のすべての文字の組合せを取るためにかかる時間を示します。すべて小文字の英字のみのパスワードである場合と大文字小文字が混在した英字と数字のパスワードの場合を仮定します。crypt-bfの項では、スラッシュの後の数値はgen_saltのiter_countです。i3のマシンを使用しました。v1.6.38の-test出力から得たものです。sha1の数値はlcrack-20031130-betaのものです。crypt-bfの数は、1000個の8文字パスワードをループする単純なプログラムを使用して得たものです。して、異なる回数の速度を示すことができました。loops/secでした。Ripperで使用されるものと同じであるという事実と一致します。)"すべての組み合わせを試行する"ことは現実的な行使ではありません。通常パスワード推定は、普通の単語とその変形の両方を含む辞書を使用して行われます。なりとも言葉に似たパスワードは上で示した数値よりも速く推定されます。6文字の単語に似ていないパスワードは推定を免れるかもしれませんし、免れないかもしれません。4880)標準の暗号処理部分を実装します。対称キーおよび公開キー暗号化がサポートされます。暗号化されたPGPメッセージは次の2つの部品(またはパケット)から構成されます。セッションキーを含むパケット。対称キーまたは公開キー暗号化の両方。セッションキーにより暗号化されたデータを含むパケット。与えられたパスワードはString2Key(S2K)アルゴリズムでハッシュ化されます。これはどちらかというとcrypt()アルゴリズムと似て、意図的に低速で、かつランダムなソルトを使用します。全長のバイナリキーを生成します。分離したセッションキーが要求された場合、新しいランダムなキーが生成されます。なくば、S2Kキーがそのままセッションキーとして使用されます。S2Kキーがそのまま使用される場合、S2K設定のみがセッションキーパケットに格納されます。なくば、セッションキーはS2Kキーで暗号化され、セッションキーパケットに格納されます。新しいランダムなセッションキーが生成されます。これは公開キーを使用して暗号化され、セッションキーパケットに格納されます。どちらの場合でもデータ暗号化は以下のように処理されます。省略可能なデータ操作として、圧縮、UTF-8への変換、改行の変換があります。データの前にはランダムなバイト数のブロックが付きます。IVを使用する場合と同じです。ランダムな前置ブロックとデータのSHA1ハッシュが後に付けられます。これをすべてセッションキーで暗号化し、データパケットに格納します。bytea対称PGPキーpswでdataを暗号化します。optionsパラメータには後述のオプション設定を含めることができます。bytea対称キーで暗号化されたPGPメッセージを復号します。pgp_sym_decryptでbytea型のデータを復号することはできません。これは無効な文字データの出力を防止するためです。元のテキストのデータをpgp_sym_decrypt_byteaで復号することが正しい方法です。optionsパラメータには後述のオプション設定を含めることができます。bytea公開PGPキーkeyでdataを暗号化します。この関数に秘密キーを与えるとエラーになります。optionsパラメータには後述のオプション設定を含めることができます。bytea公開キーで暗号化されたメッセージを復号します。keyは、暗号化に使用した公開キーに対応する秘密キーでなければなりません。秘密キーがパスワードで保護されている場合は、そのパスワードをpswで指定しなければなりません。パスワードはないが、オプションを指定したい場合は空のパスワードを指定する必要があります。pgp_pub_decryptでbytea型のデータを復号することはできません。これは無効な文字データの出力を防止するためです。元のテキストのデータをpgp_pub_decrypt_byteaで復号することが正しい方法です。optionsパラメータには後述のオプション設定を含めることができます。textpgp_key_idはPGP公開キーまたは秘密キーのキーIDを取り出します。暗号化されたメッセージが指定された場合は、データの暗号化に使用されたキーIDを与えます。2つの特殊なキーIDを返すことがあります。SYMKEYメッセージは対称キーで暗号化されました。ANYKEYメッセージは公開キーで暗号化されましたが、キーIDが消去されていました。どれで復号できるかを判定するためにはすべての秘密キーを試行しなければならないことを意味します。pgcrypto自身はこうしたメッセージを生成しません。異なるキーが同一IDを持つ場合があることに注意してください。これは稀ですが、正常なイベントです。この場合クライアントアプリケーションはどちらが当てはまるかを調べるために、ANYKEYの場合と同様に、それぞれのキーで復号を試行しなければなりません。byteaPGPのASCIIアーマー形式にデータを隠す、または、データを取り出します。ASCIIアーマーは基本的にCRC付きのBASE64という形式で、追加のフォーマットがあります。PGP関数用のオプションオプションはGnuPGに似せて命名しています。オプションの値は等号記号の後に指定しなければなりません。複数のオプションはカンマで区切ってください。cipher-algo=aes256')convert-crlfを除くすべてのオプションは暗号化関数にのみ適用可能です。復号関数はPGPデータからこうしたパラメータを入手します。興味深いオプションはおそらくcompress-algoとunicode-modeでしょう。残りはデフォルトで問題ないはずです。cipher-algo使用する暗号アルゴリズム。compress-algo使用する圧縮アルゴリズム。PostgreSQLがzlib付きで構築されている場合のみ利用可能です。compress-levelどの程度圧縮するかです。レベルが大きい程小さくなりますが、低速になります。0は圧縮を無効にします。使用して格納すべきであると規定されています。完全にRFC準拠の動作を行いたければ、これを使用してください。disable-mdcデータをSHA-1で保護しません。4880に追加される前の、古いPGP製品との互換性を得るためです。最近のgnupg.orgおよびpgp.comのソフトウェアではこれを正しくサポートしています。sess-key分離したセッションキーを使用します。公開キー暗号では常に分離したセッションキーを使用します。このオプションは対称キー暗号向けのもので、デフォルトではS2Kをそのまま使用します。s2k-mode使用するS2Kアルゴリズム。