「C++の応用 - ハッシュ」の版間の差分
(ページの作成:「== 概要 == <br><br> == Botanライブラリ == ==== Botanライブラリとは ==== Botan(牡丹の花)は、2条項BSDライセンスでリリースされたC++暗号化ライブラリである。<br> Botanは、TLSプロトコル、X.509証明書、最新のAEAD暗号、PKCS#11とTPMハードウェアのサポート、パスワードハッシュ、ポスト量子暗号スキーム等、<br> C++における暗号技術実用的なシステムを実装する…」) |
細 (文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This pag…) |
||
(同じ利用者による、間の2版が非表示) | |||
1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
ハッシュとは、任意のサイズのデータを固定長のデータに変換するアルゴリズムである。<br> | |||
ハッシュ関数と呼ばれる特殊な関数を使用して、入力データからハッシュ値 (ダイジェストとも呼ばれる) を生成する。<br> | |||
<br> | |||
ハッシュの特徴を以下に示す。<br? | |||
* 一方向性 | |||
*: ハッシュ値から元のデータを復元することは計算上非常に困難である。 | |||
* 固定長出力 | |||
*: 入力データのサイズに関係なく、ハッシュ値は常に固定長になる。 | |||
* 一意性 | |||
*: 異なる入力データから同じハッシュ値が生成される可能性は非常に低い。 (衝突耐性) | |||
* 高速性 | |||
*: ハッシュ関数は効率的で、大量のデータを高速に処理できる。 | |||
<br> | |||
ハッシュの用途を以下に示す。<br> | |||
* データの整合性検証 | |||
*: ハッシュ値を比較することで、データが改ざんされていないことを確認できる。 | |||
* パスワードの保存 | |||
*: パスワードをそのまま保存するのではなく、ハッシュ値を保存することでセキュリティを向上させる。 | |||
* データの識別 | |||
*: ハッシュ値を使用してデータを一意に識別できる。 | |||
* 署名生成 | |||
*: デジタル署名においてハッシュ関数が使用される。 | |||
<br> | |||
代表的なハッシュアルゴリズムを以下に示す。<br> | |||
* MD5 | |||
*: 古くから使用されてきたが、現在は脆弱性が発見されている。 | |||
* SHA-1 | |||
*: MD5の後継として広く使用されてきたが、現在は衝突耐性に問題があることが判明している。 | |||
* SHA-2 (SHA-256, SHA-384, SHA-512) | |||
*: 現在広く使用されている安全なハッシュアルゴリズムである。 | |||
*: <br> | |||
*: SHA-2は現在のコンピューティング能力では十分に安全であり、多くのシステムやプロトコルで広く使用されている。 | |||
*: SHA-3への移行には、ソフトウェアやインフラストラクチャの更新が必要であり、コストと時間が掛かるため、緊急性がない限り、急激な変更は推奨されない。 | |||
* SHA-3 | |||
*: SHA-2の後継として設計された新しいハッシュアルゴリズムである。 | |||
*: <br> | |||
*: ただし、新しいシステムを設計する際や、長期的なセキュリティを考慮する必要がある場合には、SHA-3の採用を検討することを推奨する。 | |||
*: SHA-3は、量子コンピュータによる攻撃に対してより耐性があると考えられており、将来を見据えた選択肢となっている。 | |||
<br> | |||
ハッシュは、データの完全性検証、パスワードの保護、効率的なデータ検索等、ソフトウェア開発のさまざまな場面で活用されてる。<br> | |||
適切なハッシュアルゴリズムを選択し、ハッシュの特性を理解することが重要である。<br> | |||
<br><br> | <br><br> | ||
47行目: | 88行目: | ||
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> | ||
{{#seo: | |||
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki | |||
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 | |||
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux | |||
|image=/resources/assets/MochiuLogo_Single_Blue.png | |||
}} | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:C++]] | [[カテゴリ:C++]] |
2024年10月14日 (月) 10:45時点における最新版
概要
ハッシュとは、任意のサイズのデータを固定長のデータに変換するアルゴリズムである。
ハッシュ関数と呼ばれる特殊な関数を使用して、入力データからハッシュ値 (ダイジェストとも呼ばれる) を生成する。
ハッシュの特徴を以下に示す。<br?
- 一方向性
- ハッシュ値から元のデータを復元することは計算上非常に困難である。
- 固定長出力
- 入力データのサイズに関係なく、ハッシュ値は常に固定長になる。
- 一意性
- 異なる入力データから同じハッシュ値が生成される可能性は非常に低い。 (衝突耐性)
- 高速性
- ハッシュ関数は効率的で、大量のデータを高速に処理できる。
ハッシュの用途を以下に示す。
- データの整合性検証
- ハッシュ値を比較することで、データが改ざんされていないことを確認できる。
- パスワードの保存
- パスワードをそのまま保存するのではなく、ハッシュ値を保存することでセキュリティを向上させる。
- データの識別
- ハッシュ値を使用してデータを一意に識別できる。
- 署名生成
- デジタル署名においてハッシュ関数が使用される。
代表的なハッシュアルゴリズムを以下に示す。
- MD5
- 古くから使用されてきたが、現在は脆弱性が発見されている。
- SHA-1
- MD5の後継として広く使用されてきたが、現在は衝突耐性に問題があることが判明している。
- SHA-2 (SHA-256, SHA-384, SHA-512)
- 現在広く使用されている安全なハッシュアルゴリズムである。
- SHA-2は現在のコンピューティング能力では十分に安全であり、多くのシステムやプロトコルで広く使用されている。
- SHA-3への移行には、ソフトウェアやインフラストラクチャの更新が必要であり、コストと時間が掛かるため、緊急性がない限り、急激な変更は推奨されない。
- SHA-3
- SHA-2の後継として設計された新しいハッシュアルゴリズムである。
- ただし、新しいシステムを設計する際や、長期的なセキュリティを考慮する必要がある場合には、SHA-3の採用を検討することを推奨する。
- SHA-3は、量子コンピュータによる攻撃に対してより耐性があると考えられており、将来を見据えた選択肢となっている。
ハッシュは、データの完全性検証、パスワードの保護、効率的なデータ検索等、ソフトウェア開発のさまざまな場面で活用されてる。
適切なハッシュアルゴリズムを選択し、ハッシュの特性を理解することが重要である。
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キー導出関数の使用により、レインボーテーブル攻撃とブルートフォース攻撃に対する耐性が向上している。
ただし、実際の設計では、イテレーション回数を適切に調整して、ハードウェアの進歩に合わせて定期的に更新する必要がある。