Uncategorized

RustでArgon2のアルゴリズムを扱うargon2クレートを使ってみる

dsk0425lucky

Argon2とは?

Argon2は、2015年のパスワードハッシングコンペティションで優勝した、現在最も推奨されているパスワードハッシングアルゴリズムの一つです。このアルゴリズムには、耐メモリ攻撃、耐サイドチャネル攻撃の特性を備えた複数のバリエーションがあります:

  • Argon2d: GPU攻撃に対して強いが、サイドチャネル攻撃には脆弱。
  • Argon2i: サイドチャネル攻撃に強い設計。
  • Argon2id: 上記二つの良い特性を組み合わせたもので、一般的な用途に最も推奨されます。

Rustでの実装方法

Argon2アルゴリズムをRustで実装するには、argon2 クレートを使用します。以下は基本的な使用例です:

Cargo.tomlに以下を追加

Rust
[dependencies]
argon2 = "0.5.3"
password-hash = { version = "0.5.0", features = ["getrandom"] }

argon2クレートはpassword-hashクレートをRe-exportしています。

Rust
use argon2::password_hash::{
    rand_core::OsRng,
    PasswordHash,
    PasswordHasher,
    PasswordVerifier,
    SaltString,
};
use argon2::Argon2;

fn main() {
    let password = b"secret_password";
    let salt = SaltString::generate( &mut OsRng);
    // デフォルト設定を使用してアルゴリズムを初期化
    let argon2 = Argon2::default();
    
    // パスワードをハッシュ化する
    let password_hash = argon2.hash_password(password, &salt)
        .unwrap()
        .to_string();

    // ハッシュを検証
    let parsed_hash = PasswordHash::new(&password_hash)
        .unwrap();
    let result = argon2
        .verify_password(password, &parsed_hash)
        .is_ok();
    
    println!("password_hash = {}", password_hash);
    println!("parsed_hash = {:?}", parsed_hash);
    println!("result = {}", result);
}

Argon2::default()のデフォルト値は
AlgorithmはOWASPによっても推奨されるArgon2idを使用し、
VersionはV0x13(バージョン19)を採用しています、
Paramsはargon2クレートが推奨するデフォルトパラメータ。

出力結果

ハッシュ化されたパスワード。

Bash
password_hash = $argon2id$v=19$m=19456,t=2,p=1$fwaOLxRginmaeJBKnTJ0vQ$NOfhTji56BtWSCwF8esr5b/vqcTEBM2COtUd0RW+wNY

parsed_hashの値はこのようになっています。
パスワードハッシュとソルトの値、そしてそれがどのように構成されているかを示しています。これにより、検証プロセスで正確に比較できます。

Bash
parsed_hash = PasswordHash { 
	algorithm: Ident("argon2id"), 
	version: Some(19), 
	params: {
		Ident("m"): Value("19456"), 
		Ident("t"): Value("2"), 
		Ident("p"): Value("1")
	}, 
	salt: Some(
		Salt("fwaOLxRginmaeJBKnTJ0vQ")
	), 
	hash: Some(
		Output("NOfhTji56BtWSCwF8esr5b/vqcTEBM2COtUd0RW+wNY")
	) 
}

検証結果

Bash
result = true

verify_password() メソッドを使用してパスワードが正しいかどうかを検証し、結果はブール値(trueまたはfalse)で表示されました。

今回は、ランダムなソルトと共にArgon2アルゴリズムを使用してハッシュ化し、その結果を検証しました。

前回の記事
RustでJSON Web Tokens(JWT)を扱うjsonwebtokenクレートを使ってみる ①
RustでJSON Web Tokens(JWT)を扱うjsonwebtokenクレートを使ってみる ①
ABOUT ME
Dsk
Dsk
Rustのプログラミング言語を学習しています。 わからないことなど多々ありますので、ご指摘いただけますと幸いです
記事URLをコピーしました