WindowsのモダンC++で強力な暗号化ハッシュ関数を学ぶ (SHA, SHA2, MD5, BobJenkins)
目次
概要
暗号学的ハッシュ関数は、任意のサイズの入力を受け取り、同じサイズの出力を生成する一方向アルゴリズムです。
暗号化ハッシュ関数は、ハッシュ関数のより安全なバージョンです。情報損失があるという点では一方通行であり、出力から入力に再び簡単に戻すことはできません。暗号化ハッシュはデータが変更されていないことを検証するための署名に最もよく使用されます。また、ユーザー名やパスワードなどの暗号化関数としても使用されます。一般的なハッシュ関数には、SHA、SHA2、SHA3、MD5、BobJenkinsなどがあります。C++BuilderやDelphiでのSHA Hashについては、Jim McKeethのこちらの記事を参照ください。
暗号化ハッシュ関数は、一方向ののアルゴリズムであるため、ユーザー名とパスワードの保存に適しています。ユーザーが新しいアカウントを作成したとき、アプリケーションはそのユーザー名とパスワードをハッシュ化し、ハッシュ化されたユーザー名とパスワードをデータベースに保存する必要があります。
もし誰かがデータベースで作業している場合 (例えば、DB開発者やDB管理者など)、ハッシュコードを見ることはできますが、そこでユーザー名とパスワードを知ることはできません。ユーザーがログインすると、再びアプリケーションのログインイベントで入力されたユーザー名とパスワードがハッシュ化され、そのハッシュ化された変数が正しいかどうかを問い合わせます。
それのデータが正しい場合、アプリケーションはユーザーのログインを可能にします。暗号化されたハッシュ関数は、長いテキストに変更があるかどうかを理解したり、そのオリジナル性をチェックするのにも適しています。
C++Builderでは、ハッシュ関数はSystem.Hash.hppに含まれているので、これらの関数を使用するには、このヘッダーのインクルードが必要です。
SHA関数によるハッシュコードの生成
ustr = L"Hey! this unicode string will be hashed";
UnicodeString hash_sha = THashSHA1::GetHashString(ustr);
SHA2関数によるハッシュコードの生成
ustr = L"Hey! this unicode string will be hashed";
UnicodeString hash_sha224 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA224);
UnicodeString hash_sha256 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA256);
UnicodeString hash_sha384 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA384);
UnicodeString hash_sha512 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA512);
UnicodeString hash_sha512224 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA512_224);
UnicodeString hash_sha512256 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA512_256);
MD5関数によるハッシュコードの生成
ustr = L"Hey! this unicode string will be hashed";
UnicodeString hash_MD5 = THashMD5::GetHashString(ustr);
BobJenkins関数によるハッシュコードの生成
ustr = L"Hey! this unicode string will be hashed";
UnicodeString hash_bob = THashBobJenkins::GetHashString(ustr);
VCLのサンプル
#include <vcl.h>
#include <System.Hash.hpp>
void generate_hashcodes(UnicodeString ustr)
{
UnicodeString hash_sha = THashSHA1::GetHashString(ustr);
UnicodeString hash_sha224 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA224);
UnicodeString hash_sha256 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA256);
UnicodeString hash_sha384 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA384);
UnicodeString hash_sha512 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA512);
UnicodeString hash_sha512224 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA512_224);
UnicodeString hash_sha512256 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA512_256);
UnicodeString hash_MD5 = THashMD5::GetHashString(ustr);
UnicodeString hash_bob = THashBobJenkins::GetHashString(ustr);
}
FMXのサンプル
#include <fmx.h>
#include <System.Hash.hpp>
void generate_hashcodes(UnicodeString ustr)
{
UnicodeString hash_sha = THashSHA1::GetHashString(ustr);
UnicodeString hash_sha224 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA224);
UnicodeString hash_sha256 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA256);
UnicodeString hash_sha384 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA384);
UnicodeString hash_sha512 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA512);
UnicodeString hash_sha512224 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA512_224);
UnicodeString hash_sha512256 = THashSHA2::GetHashString(ustr, THashSHA2::TSHA2Version::SHA512_256);
UnicodeString hash_MD5 = THashMD5::GetHashString(ustr);
UnicodeString hash_bob = THashBobJenkins::GetHashString(ustr);
}