「C++の応用 - ハッシュ」の版間の差分

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
(ページの作成:「== 概要 == <br><br> == Botanライブラリ == ==== Botanライブラリとは ==== Botan(牡丹の花)は、2条項BSDライセンスでリリースされたC++暗号化ライブラリである。<br> Botanは、TLSプロトコル、X.509証明書、最新のAEAD暗号、PKCS#11とTPMハードウェアのサポート、パスワードハッシュ、ポスト量子暗号スキーム等、<br> C++における暗号技術実用的なシステムを実装する…」)
 
47行目: 47行目:
  make -j $(nproc)
  make -j $(nproc)
  make install
  make install
<br>
==== ハッシュ化の例 ====
以下の例では、SHA3-512を使用してパスワードをハッシュ化している。<br>
<br>
まず、ユーザはパスワードを入力して、<code>sha3_512</code>関数を使用してパスワードをハッシュ化して、結果を出力する。<br>
<code>sha3_512</code>関数は、入力文字列をSHA3-512でハッシュ化して、16進数エンコードされたハッシュ値を返す。<br>
<syntaxhighlight lang="c++">
#include <iostream>
#include <string>
#include <botan/sha3.h>
#include <botan/hex.h>
std::string sha3_512(const std::string& input)
{
    Botan::SHA_3_512 sha3;
    sha3.update(input);
    return Botan::hex_encode(sha3.final());
}
int main()
{
    std::string password;
    std::cout << "Enter password: ";
    std::getline(std::cin, password);
    std::string hashed_password = sha3_512(password);
    std::cout << "Hashed password: " << hashed_password << std::endl;
    return 0;
}
</syntaxhighlight>
<br>
<u>※注意</u><br>
<u>実際の設計では、パスワードをハッシュ化する際に、ソルト(salt)を追加して適切なキー導出関数 (例: PBKDF2、bcrypt、scrypt) を使用することが重要である。</u><br>
<u>これにより、レインボーテーブル攻撃や辞書攻撃に対する耐性が向上する。</u><br>
<br>
実際の設計では、パスワードをハッシュ化する際に、以下に示すような追加のセキュリティ対策が必要である。<br>
* ソルト(salt)の追加
*: ユーザごとにランダムな値 (ソルト) を生成して、パスワードとともにハッシュ化する。
*: これにより、レインボーテーブル攻撃を防ぐことができる。
* キー導出関数の使用
*: PBKDF2、bcrypt、scrypt等のキー導出関数を使用して、パスワードとソルトからハッシュ値を生成する。
*: これらの関数は、意図的に計算コストが高く設計されており、ブルートフォース攻撃を遅延させることができる。
* 十分なイテレーション回数の選択
*: キー導出関数のイテレーション回数を十分に高く設定して、攻撃者がパスワードを推測するのに多大な時間を要するようにする。
<br>
==== セキュリティ対策を施したハッシュ化の例 ====
以下の例では、SHA3-512、ソルト、およびPBKDF2を使用してパスワードをハッシュ化している。<br>
<br>
上記の例に加えて、追加のセキュリティ対策が導入されている。<br>
* generate_salt関数
*: 16バイトのランダムなソルトを生成する。
* pbkdf2_sha3_512関数
*: PBKDF2キー導出関数とSHA3-512ハッシュ関数を使用して、パスワードとソルトからハッシュ値を生成する。
*: イテレーション回数は100,000回に設定している。
<syntaxhighlight lang="c++">
#include <iostream>
#include <string>
#include <botan/sha3.h>
#include <botan/pbkdf2.h>
#include <botan/auto_rng.h>
#include <botan/hex.h>
std::string pbkdf2_sha3_512(const std::string& password, const std::string& salt, size_t iterations)
{
    Botan::PBKDF2 pbkdf2("SHA-3(512)");
    Botan::secure_vector<uint8_t> key = pbkdf2.derive_key(64, password, salt, iterations).bits_of();
    return Botan::hex_encode(key);
}
std::string generate_salt(size_t length)
{
    Botan::AutoSeeded_RNG rng;
    return Botan::hex_encode(rng.random_vec(length));
}
int main()
{
    std::string password;
    std::cout << "Enter password: ";
    std::getline(std::cin, password);
    size_t iterations = 100000;
    std::string salt = generate_salt(16);
    std::string hashed_password = pbkdf2_sha3_512(password, salt, iterations);
    std::cout << "Salt: " << salt << std::endl;
    std::cout << "Hashed password: " << hashed_password << std::endl;
    return 0;
}
</syntaxhighlight>
<br>
ソルトの追加とPBKDF2キー導出関数の使用により、レインボーテーブル攻撃とブルートフォース攻撃に対する耐性が向上している。<br>
ただし、実際の設計では、イテレーション回数を適切に調整して、ハードウェアの進歩に合わせて定期的に更新する必要がある。<br>
<br><br>
<br><br>



2024年5月22日 (水) 17:07時点における版

概要



Botanライブラリ

Botanライブラリとは

Botan(牡丹の花)は、2条項BSDライセンスでリリースされたC++暗号化ライブラリである。
Botanは、TLSプロトコル、X.509証明書、最新のAEAD暗号、PKCS#11とTPMハードウェアのサポート、パスワードハッシュ、ポスト量子暗号スキーム等、
C++における暗号技術実用的なシステムを実装するために必要なツールを提供している。

また、Pythonバインディングも含まれており、他の言語バインディングも利用できる。

Botanライブラリには、機能豊富なコマンドラインインターフェイスが付属している。

Botanライブラリに含まれている機能の詳細を知りたい場合は、公式ドキュメントを参照すること。

Botanライブラリのインストール

パッケージ管理システムからインストール
# RHEL
sudo dnf install botan-devel

# SUSE
sudo zypper install libbotan-devel


ソースコードからインストール

Botanライブラリのビルドは、Pythonスクリプトのconfigure.pyファイルにより制御されている。
そのため、Python 3以降が必要となる。

Botanライブラリの公式Webサイトにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf Botan-<バージョン>.tar.xz
cd Botan-<バージョン>


または、BotanライブラリのGithubからソースコードをダウンロードする。

git clone https://github.com/randombit/botan.git
cd botan


Botanライブラリをビルドおよびインストールする。
外部依存を必要とするためにスキップされるものは、明示的に要求する必要がある。 (例えば、Zlibのサポートを有効にするには、configure.pyに--with-zlibオプションを付加する)
利用可能なモジュールは、--list-modulesオプションを付加して、表示することができる。

./configure.py --cc=gcc --cc-bin=<GCC 11以降のGCC>             \
               --prefix=<Botanライブラリのインストールディレクトリ>      \
               --with-build-dir=<Botanライブラリのビルドディレクトリ>  \
               --with-zlib  \  # Zlibを有効にする場合
               --with-lzma  \  # LZMAを有効にする場合
               --with-bzip2 \  # Bzip2を有効にする場合
               --with-sqlite3  # SQLite3を有効にする場合
make -j $(nproc)
make install


ハッシュ化の例

以下の例では、SHA3-512を使用してパスワードをハッシュ化している。

まず、ユーザはパスワードを入力して、sha3_512関数を使用してパスワードをハッシュ化して、結果を出力する。
sha3_512関数は、入力文字列をSHA3-512でハッシュ化して、16進数エンコードされたハッシュ値を返す。

 #include <iostream>
 #include <string>
 #include <botan/sha3.h>
 #include <botan/hex.h>
 
 std::string sha3_512(const std::string& input)
 {
    Botan::SHA_3_512 sha3;
    sha3.update(input);
    return Botan::hex_encode(sha3.final());
 }
 
 int main()
 {
    std::string password;
    std::cout << "Enter password: ";
    std::getline(std::cin, password);
 
    std::string hashed_password = sha3_512(password);
    std::cout << "Hashed password: " << hashed_password << std::endl;
 
    return 0;
 }


※注意
実際の設計では、パスワードをハッシュ化する際に、ソルト(salt)を追加して適切なキー導出関数 (例: PBKDF2、bcrypt、scrypt) を使用することが重要である。
これにより、レインボーテーブル攻撃や辞書攻撃に対する耐性が向上する。

実際の設計では、パスワードをハッシュ化する際に、以下に示すような追加のセキュリティ対策が必要である。

  • ソルト(salt)の追加
    ユーザごとにランダムな値 (ソルト) を生成して、パスワードとともにハッシュ化する。
    これにより、レインボーテーブル攻撃を防ぐことができる。
  • キー導出関数の使用
    PBKDF2、bcrypt、scrypt等のキー導出関数を使用して、パスワードとソルトからハッシュ値を生成する。
    これらの関数は、意図的に計算コストが高く設計されており、ブルートフォース攻撃を遅延させることができる。
  • 十分なイテレーション回数の選択
    キー導出関数のイテレーション回数を十分に高く設定して、攻撃者がパスワードを推測するのに多大な時間を要するようにする。


セキュリティ対策を施したハッシュ化の例

以下の例では、SHA3-512、ソルト、およびPBKDF2を使用してパスワードをハッシュ化している。

上記の例に加えて、追加のセキュリティ対策が導入されている。

  • generate_salt関数
    16バイトのランダムなソルトを生成する。
  • pbkdf2_sha3_512関数
    PBKDF2キー導出関数とSHA3-512ハッシュ関数を使用して、パスワードとソルトからハッシュ値を生成する。
    イテレーション回数は100,000回に設定している。
 #include <iostream>
 #include <string>
 #include <botan/sha3.h>
 #include <botan/pbkdf2.h>
 #include <botan/auto_rng.h>
 #include <botan/hex.h>
 
 std::string pbkdf2_sha3_512(const std::string& password, const std::string& salt, size_t iterations)
 {
    Botan::PBKDF2 pbkdf2("SHA-3(512)");
    Botan::secure_vector<uint8_t> key = pbkdf2.derive_key(64, password, salt, iterations).bits_of();
    return Botan::hex_encode(key);
 }
 
 std::string generate_salt(size_t length)
 {
    Botan::AutoSeeded_RNG rng;
    return Botan::hex_encode(rng.random_vec(length));
 }
 
 int main()
 {
    std::string password;
    std::cout << "Enter password: ";
    std::getline(std::cin, password);
 
    size_t iterations = 100000;
    std::string salt = generate_salt(16);
 
    std::string hashed_password = pbkdf2_sha3_512(password, salt, iterations);
    std::cout << "Salt: " << salt << std::endl;
    std::cout << "Hashed password: " << hashed_password << std::endl;
 
    return 0;
 }


ソルトの追加とPBKDF2キー導出関数の使用により、レインボーテーブル攻撃とブルートフォース攻撃に対する耐性が向上している。
ただし、実際の設計では、イテレーション回数を適切に調整して、ハードウェアの進歩に合わせて定期的に更新する必要がある。