w3cのcryptoAPIを読む機会があったのでついでにまとめてみました
下の画像はサポートしてるアルゴリズムとそのアルゴリズムでできることが表になったものです
引用元(https://www.w3.org/TR/WebCryptoAPI/#algorithm-overview)
Web Crypto APIとは
cryptoは、JavaScriptで利用できるWeb APIの一部で、暗号関連のタスクを実行するためのインターフェースを提供しています。これにより、デベロッパーは安全な方法で情報を暗号化、復号化、署名などの操作を行うことができます。
WebだけでなくNodeやDenoなどのサーバー用ランタイムでも用意されてるAPIです。
アルゴリズム一覧
RSA
公開鍵暗号の一つで、データの暗号化やデジタル署名に使用されます。
SSL/TLSの鍵交換などで多く使われてます。
以下の三つのアルゴリズムが当てはまります。
- RSASSA-PKCS1-v1_5 (過去のSSL/TSL)
- RSA-PSS
- RSA-OAEP
それぞれの違いは分かりやすい解説があったのでリンク
https://qiita.com/kj1/items/aebbb73a034f36d73e40
ECC
楕円曲線暗号 (Elliptic Curve Cryptography, ECC)
ECCもRSA同様、公開鍵暗号ですが、短い鍵長でもセキュリティレベルを維持できるのが特徴です。
IoTなどのリソース制限のあるデバイスで使用されます。また、ブロックチェーンで使われていることも有名です
以下の二つのアルゴリズムが当てはまります。
- ECDSA
- ECDH
ECDSA はデジタル署名、ECDHは鍵交換に使われます
AES
AES (Advanced Encryption Standard)
ブロック暗号の一つであり、多くのセキュリティ要件に対して標準として採用されています。
SSL/TLSの暗号化にも使われることが多いです。
以下の四つが当てはまります。
- AES-CTR
- AES-CBC
- AES-GCM
- AES-KW
CBCはパディング(平文が固定長のブロックサイズに適合しないときにデータを補完すること)が必要なモード
CTRはパディングを必要としない単純なモード。二度同じ乱数を使うことはできない。同じ乱数を二度使用すると二つの暗号文のXORをとることで2つの平文のXORを使用できてしまう
GCMはCTRモードに追加で、メッセージ認証コード(MAC)の生成も行う方式。MACは高速化や改ざんの対策に使用される
KWは鍵自体を暗号化するためのモード。鍵専用の暗号化モードなので、他のモードとは用途が違うことに注意
参考
https://stackoverflow.com/questions/1220751/how-to-choose-an-aes-encryption-mode-cbc-ecb-ctr-ocb-cfb
HMAC
HMACはメッセージ認証コード(MAC)の生成を行うアルゴリズムです
SHA
SHAはハッシュ関数で文字列のハッシュ化を行います。
ハッシュ関数はデータの完全性チェックやパスワードの保存に使用されます
以下のアルゴリズムが当てはまります
- SHA-1
- SHA-256
- SHA-384
- SHA-512
SHA-1は160ビット、SHA-256, SHA-384,SHA-512はそれぞれ256ビット,384ビット,512ビットのハッシュ値を生成します。
鍵導出アルゴリズム
鍵導出関数はマスターキーから派生したサブキーを生成するアルゴリズムです。
鍵は長期間にわたって同じものを使用すると、セキュリティリスクが高まります。鍵導出アルゴリズムを使用して、定期的に新しい鍵を生成し、旧鍵を無効にすることができます。
以下の二つが当てはまります
- HKDF
- PBKDF2
HKDFは暗号化キー、認証用の鍵、セキュリティトークンなど、高いセキュリティ要件がある場合に使用されます。
PBKDF2はパスワードベースの鍵派生で使われます。パスワードは通常、人が覚えられる長さで鍵の長さとしては不十分です。PBKDF2はパスワードのような低エントロピー情報をストレッチングする(長さを増やす)ことが特徴です。
アルゴリズムが可能な使用方法
アルゴリズムによって提供される可能な使用方法は以下の通りです。
-
encrypt: データを暗号化するためにアルゴリズムを使用します。
-
decrypt: 暗号化されたデータを復号化するためにアルゴリズムを使用します。
-
sign: デジタル署名を生成するためにアルゴリズムを使用します。データの完全性と認証を保証するのに役立ちます。
-
verify: デジタル署名を検証するためにアルゴリズムを使用します。データの正当性を確認します。
-
digest: ハッシュ関数を使用してデータの固定長のダイジェスト(ハッシュ値)を生成するためにアルゴリズムを使用します。データの一意性を確保するために役立ちます。
-
generateKey: 新しい鍵を生成するためにアルゴリズムを使用します。鍵の生成はセキュリティの基本です。
-
deriveKey: 既存の鍵から新しい鍵を派生させるためにアルゴリズムを使用します。鍵の階層化や派生に使用されます。
-
deriveBits: 鍵からビット列を派生させるためにアルゴリズムを使用します。ビット操作により新しいデータを生成します。
-
importKey: 外部から鍵を導入し、内部フォーマットに変換するためにアルゴリズムを使用します。外部の鍵を内部で使用可能な形式に変換します。
-
exportKey: 内部で使用している鍵を外部形式にエクスポートするためにアルゴリズムを使用します。他のシステムやアプリケーションで使用できるようにします。
-
wrapKey: 鍵を保護し、他の鍵で暗号化するためにアルゴリズムを使用します。鍵をセキュアに転送や保存するために使用されます。
-
unwrapKey: 暗号化された鍵を復号化し、使用可能な形式に戻すためにアルゴリズムを使用します。暗号化された鍵を元の状態に復元します。
終わりに
全ての暗号化/ハッシュ化アルゴリズムを把握するのは現実的ではないので、とりあえずWeb標準で使われているものを見ておくだけでも何か役に立つかもしれないです。