Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ハッシュ化

ファイルの SHA-256 ダイジェストを計算する

ring-badge data-encoding-badge cat-cryptography-badge

いくつかのデータをファイルに書き込み、その後 digest::Context を使用して ファイルの内容の SHA-256 digest::Digest を計算します。

use anyhow::Result;
use ring::digest::{Context, Digest, SHA256};
use data_encoding::HEXUPPER;
use std::fs::File;
use std::io::{BufReader, Read, Write};

fn sha256_digest<R: Read>(mut reader: R) -> Result<Digest> {
    let mut context = Context::new(&SHA256);
    let mut buffer = [0; 1024];

    loop {
        let count = reader.read(&mut buffer)?;
        if count == 0 {
            break;
        }
        context.update(&buffer[..count]);
    }

    Ok(context.finish())
}

fn main() -> Result<()> {
    let path = "file.txt";

    let mut output = File::create(path)?;
    write!(output, "このテキストのダイジェストを生成します")?;

    let input = File::open(path)?;
    let reader = BufReader::new(input);
    let digest = sha256_digest(reader)?;

    println!("SHA-256 ダイジェストは {} です", HEXUPPER.encode(digest.as_ref()));

    Ok(())
}

HMAC ダイジェストでメッセージに署名して検証する

ring-badge cat-cryptography-badge

hmac::sign メソッドは、指定されたキーを使用してメッセージの HMAC ダイジェスト(タグとも呼ばれます)を計算するために使用されます。 生成された hmac::Tag 構造体には HMAC の生のバイト列が含まれており、 後からhmac::verifyで検証することで、メッセージが改ざんされておらず、信頼できる送信元から送られてきたことを確認できます。

use ring::{hmac, rand};
use ring::rand::SecureRandom;
use ring::error::Unspecified;

fn main() -> Result<(), Unspecified> {
    let mut key_value = [0u8; 48];
    let rng = rand::SystemRandom::new();
    rng.fill(&mut key_value)?;
    let key = hmac::Key::new(hmac::HMAC_SHA256, &key_value);

    let message = "Legitimate and important message.";
    let signature: hmac::Tag = hmac::sign(&key, message.as_bytes());
    hmac::verify(&key, message.as_bytes(), signature.as_ref())?;

    Ok(())
}