Cryptology Academy · レッスン

libsodium:誤用に強い暗号ライブラリ

安全でないパラメータを選びにくくするlibsodiumの設計思想に基づいたAPIについて学びます。

レッスン 1/413 ステップ

「libsodium:誤用に強い暗号ライブラリ」はCoddyKit上の無料Cryptology Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCryptology Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cryptology Academyコースには全4レッスンが含まれています。

libsodium の理念と起源

libsodium は、Daniel Bernstein、Tanja Lange、Peter Schwabe が開発した NaCl(Networking and Cryptography library)ライブラリを、移植性とクロスプラットフォーム性を備えた形でビルドしたものとして、Frank Denis によって作成されました。その中核となる理念は、正しい暗号の使い方をできるだけ簡単にし、誤った使い方をできるだけ難しくすることです。安全なデフォルト、シンプルな API、そして明確なアルゴリズムの選択により、低レベルライブラリで起こりがちな一般的なミスを防ぎます。

秘密鍵認証付き暗号化

crypto_secretboxは、XSalsa20-Poly1305を使用して秘密鍵認証付き暗号化を提供します。APIには、メッセージ、24バイトのnonce(ランダムに生成)、32バイトの鍵を渡します。出力される暗号文は、暗号化と認証の両方が施されています。crypto_secretbox_openは、認証タグの検証と復号をアトミックに行い、改ざんが検出された場合はエラーを返します。これにより、破損した暗号文や悪意を持って変更された暗号文が復号されるのを防ぎます。

公開鍵認証付き暗号化

crypto_boxは、X25519-XSalsa20-Poly1305を使用して、2者間の公開鍵認証付き暗号化を提供します。送信者の秘密鍵と受信者の公開鍵を使用してメッセージを暗号化および認証するため、意図した受信者だけが復号でき、受信者は送信者の身元を検証できます。crypto_box_sealは匿名版です。送信者は隠され、提供されるのは暗号化のみで、送信者の認証は行われません。

Ed25519によるデジタル署名

crypto_signは、Ed25519を使用してデジタル署名を実装します。鍵の生成では、64バイトの秘密鍵(実際にはseedと公開鍵を連結したもの)と32バイトの公開鍵が生成されます。署名の生成では64バイトの署名が生成されます。検証は高速かつconstant-timeで行われます。Ed25519の署名は決定論的であり、同じメッセージと鍵からは常に同じ署名が生成されるため、一部の実装でECDSAに影響した乱数生成失敗の脆弱性が排除されます。

BLAKE2bによるハッシュ化

crypto_generichashは、BLAKE2bを使用した汎用ハッシュ化を提供します。SHA-256とは異なり、BLAKE2bでは鍵付きハッシュ化のために別個のHMAC構成を必要とせず、鍵を直接受け取れます。出力長は16バイトから64バイトまで設定できます。BLAKE2bは、同等以上のセキュリティ特性を備えながら、最新の64ビットプロセッサ上ではSHA-256やSHA-512よりも高速です。

BLAKE2bによる鍵導出

crypto_kdfは、BLAKE2bを使用してマスター鍵から鍵を導出します。32バイトのマスター鍵、用途を識別する8バイトのコンテキスト文字列、64ビットのサブキーIDを指定すると、長さを設定可能な暗号学的に独立したサブキーが導出されます。これにより、1つのマスター鍵から用途ごとに複数の独立した鍵を導出でき、導出された鍵同士の相関を防げます。

Argon2idによるパスワードハッシュ化

crypto_pwhashは、Password Hashing Competitionの優勝アルゴリズムであるArgon2idを使用してパスワードをハッシュ化します。Argon2idは、メモリ困難な計算(GPU攻撃への耐性)と時間困難な計算(ASIC攻撃への耐性)を組み合わせています。パラメーターには、セキュリティ要件に合わせて調整できる演算数の上限(時間コスト)とメモリ上限があります。crypto_pwhash_strは、アルゴリズムとパラメーターを含む、保存に適した標準形式の文字列を生成します。

匿名暗号化のためのSealed Box

crypto_box_sealは、送信者を明らかにせずに受信者向けのメッセージを暗号化します。一時的なエフェメラル鍵ペアを生成し、受信者の公開鍵との鍵交換を実行した後、エフェメラル秘密鍵を破棄します。受信者は自分の秘密鍵を使って復号できますが、送信者を特定することはできません。匿名の投稿システムや一方向の暗号化チャネルに適しています。

libsodiumの言語バインディング

libsodiumには、ほぼすべての主要なプログラミング言語向けのバインディングがあります。PyNaClは、Pythonらしい例外とbytesオブジェクトを備えた、慣用的なPythonバインディングを提供します。libsodium-wrappersはJavaScript/Node.js向けのバインディングを提供し、ブラウザーではWASMを使用します。libsodium.jsは純粋なJavaScriptによる移植版です。バインディングの品質には差があるため、アルゴリズムを再実装するものではなく、Cライブラリをラップする公式または広く保守されているバインディングを優先してください。

OpenSSL低レベルAPIとの比較

OpenSSLの低レベルAPIでは、アルゴリズム、鍵長、モード、パディング、IVの管理について明示的に判断する必要があります。誤った組み合わせも警告なしに受け入れられます。libsodiumでは、用途ごとに正しい実装が1つ提供され、設定は必要ありません。たとえばOpenSSLで暗号化するには、暗号、モード、鍵導出、IV生成、パディングを選択する必要があります。一方、libsodiumのcrypto_secretboxでは、鍵、nonce、メッセージを渡すだけで、残りは正しく処理されます。

新規プロジェクトでのlibsodiumの選択

libsodiumは、対応言語で暗号処理を必要とするあらゆるプロジェクトの出発点として推奨されます。小さなAPIサーフェスによって誤用の可能性が減り、アルゴリズムは最新かつ十分に分析されており、クロスプラットフォームのC実装も入念にテストされています。OpenSSLのような低レベルライブラリに移行する必要があるのは、通常、libsodiumで利用できない特定のアルゴリズムが必要な場合、またはFIPS 140-2の検証が必要な場合に限られます。

libsodiumの操作

データベースに保存するパスワードをハッシュ化するには、どのlibsodium関数を使用すべきでしょうか。

libsodiumのまとめ

libsodiumのまとめ:安全なデフォルト設定と誤用しにくいAPIを備え、BernsteinらによるNaClのプリミティブを基盤としています。秘密鍵暗号化(XSalsa20-Poly1305)にはcrypto_secretbox、公開鍵暗号化(X25519)にはcrypto_box、Ed25519署名にはcrypto_sign、BLAKE2bハッシュ化にはcrypto_generichash、Argon2idパスワードハッシュ化にはcrypto_pwhashを使用します。また、匿名暗号化のためのSealed Boxと、ほとんどの主要プラットフォーム向けの言語バインディングも提供します。

無料で開始

AI チューターと学ぶ Cryptology Academy — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
67
レッスン
261

よくある質問

「libsodium:誤用に強い暗号ライブラリ」レッスンは無料ですか?

はい。「libsodium:誤用に強い暗号ライブラリ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cryptology Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cryptology Academyコースには全4レッスンが含まれています。

「libsodium:誤用に強い暗号ライブラリ」で何を学びますか?

安全でないパラメータを選びにくくするlibsodiumの設計思想に基づいたAPIについて学びます。 ブラウザで直接実行するハンズオンコードでCryptology Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Cryptology Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCryptology Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「libsodium:誤用に強い暗号ライブラリ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCryptology Academyレッスンでコードを書いて実行できますか?

はい。すべてのCryptology Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. libsodium:誤用に強い暗号ライブラリ
  2. OpenSSL API:主要な構造体と落とし穴
  3. Google Tink:安全な高レベル暗号API
  4. 暗号依存関係の監査と選定
← Cryptology Academyに戻る