Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】MHASH_RIPEMD160定数の使い方

MHASH_RIPEMD160定数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

MHASH_RIPEMD160定数は、PHPのmhashエクステンションにおいて、RIPEMD-160というハッシュアルゴリズムを識別するために使用される定数です。ハッシュアルゴリズムとは、任意の長さの入力データから、固定長の「ハッシュ値」と呼ばれる一意の値を生成する一方向の関数を指します。このハッシュ値は、元のデータを復元することが非常に困難である特性を持つため、データの改ざん検出やパスワードの安全な保存など、セキュリティ関連の様々な用途で利用されます。

RIPEMD-160は、特に160ビット(20バイト)のハッシュ値を生成するアルゴリズムの一つです。この定数を利用することで、mhashエクステンションが提供する関数に対して、データからRIPEMD-160形式のハッシュ値を計算するよう指示することが可能でした。データの整合性を確認する際や、デジタル署名を作成する際のメッセージダイジェスト生成などに用いられることがあります。

ただし、重要な情報として、mhashエクステンション自体はPHP 7.0で非推奨となり、PHP 7.1でPHPのコアから完全に削除されました。そのため、PHP 8などの現在のバージョンにおいては、このMHASH_RIPEMD160定数を含むmhashエクステンションの機能は利用できません。現代のPHP開発では、より新しく、広範なハッシュアルゴリズムをサポートしているhashエクステンションの利用が強く推奨されています。hashエクステンションは、RIPEMD-160を含む多くのハッシュアルゴリズムを安全かつ効率的に提供しており、代替としてhash()関数を用いることで同様の処理を行うことが可能です。

構文(syntax)

1<?php
2echo MHASH_RIPEMD160;

引数(parameters)

引数なし

引数はありません

戻り値(return)

戻り値なし

戻り値はありません

サンプルコード

PHPでRIPEMD160ハッシュを生成する

1<?php
2
3/**
4 * 指定された文字列の RIPEMD-160 ハッシュを生成します。
5 *
6 * PHP 8において、MHASH_RIPEMD160 定数を含む mhash 拡張は削除されました。
7 * 現在は、hash() 関数を使用してRIPEMD-160ハッシュを生成することが推奨されます。
8 *
9 * @param string $data ハッシュを生成する元のデータ
10 * @return string 生成された RIPEMD-160 ハッシュ文字列
11 */
12function generateRipemd160Hash(string $data): string
13{
14    // hash() 関数は、指定されたアルゴリズムで文字列のハッシュ値を計算します。
15    // 'ripemd160' はサポートされているハッシュアルゴリズムの文字列名です。
16    return hash('ripemd160', $data);
17}
18
19// サンプルデータ
20$sampleData = 'Hello, System Engineer Beginner!';
21
22// RIPEMD-160 ハッシュを生成し、表示
23$ripemd160Hash = generateRipemd160Hash($sampleData);
24
25echo "元のデータ: " . $sampleData . "\n";
26echo "RIPEMD-160 ハッシュ: " . $ripemd160Hash . "\n";
27
28?>

PHP 8より前のバージョンでは、mhash拡張に含まれるMHASH_RIPEMD160という定数を用いてRIPEMD-160ハッシュを生成していました。しかし、PHP 8においてこのmhash拡張は削除されたため、現在ではMHASH_RIPEMD160定数は利用できません。代わりに、より汎用的なhash()関数を使用することが現在の標準的な方法として推奨されています。

提示されたサンプルコードは、このhash()関数を使ってRIPEMD-160ハッシュを生成する現代的な方法を示しています。generateRipemd160Hash関数は、引数$dataで受け取った文字列のRIPEMD-160ハッシュ値を計算して返します。この関数内部では、hash('ripemd160', $data)が実行されます。ここで、最初の引数'ripemd160'は使用するハッシュアルゴリズムの種類を指定し、二番目の引数$dataはハッシュ化したい元のデータを指定します。関数は計算されたハッシュ値を文字列として戻り値で返します。

サンプルコードでは、'Hello, System Engineer Beginner!'という文字列に対してこの関数を適用し、生成されたRIPEMD-160ハッシュ値を画面に表示しています。このように、hash()関数を用いることで、PHP 8以降の環境でもRIPEMD-160のような強力なハッシュアルゴリズムを手軽に利用し、データの改ざん検出やパスワードの安全な保存などに活用できます。

PHP 8では、リファレンスにあるMHASH_RIPEMD160定数を含むmhash拡張は削除されており、直接利用することはできません。初心者が古い情報に基づいてこの定数を使おうとするとエラーが発生しますのでご注意ください。サンプルコードが示しているように、現在RIPEMD-160ハッシュを生成するには、標準のhash()関数を使用することが推奨されます。hash()関数の第一引数にアルゴリズム名である'ripemd160'を文字列で指定し、第二引数にハッシュ化したいデータを渡してください。この方法は、PHPの将来のバージョンでも互換性が高く、安全にハッシュを生成するための標準的な方法です。ハッシュはデータの整合性チェックなどに利用されますが、元に戻せない一方向性の処理であり、暗号化とは異なる点も覚えておくと良いでしょう。

PHP 8 で AES-128 暗号化・復号化する

1<?php
2
3/**
4 * PHP 8 で安全なデータ暗号化と復号化を行う関数です。
5 * mcrypt 拡張は PHP 7.2 で削除されたため、この関数は OpenSSL 拡張を使用します。
6 * Rijndael-128 は AES-128 の別名です。
7 *
8 * @param string $data 暗号化するデータ
9 * @param string $key  暗号化に使用する鍵 (AES-128では16バイトである必要があります)
10 * @return array|false 暗号化されたデータとIV、復号化されたデータを含む連想配列、または失敗時はfalse
11 */
12function encryptAndDecryptAES128(string $data, string $key): array|false
13{
14    // PHP 8 では mcrypt 拡張は利用できません。
15    // キーワードにある mcrypt_rijndael_128 は、Rijndael-128 アルゴリズムを示しています。
16    // Rijndael-128 は AES-128 の別名であり、OpenSSL 拡張で代替できます。
17    //
18    // リファレンス情報にある MHASH_RIPEMD160 は、ハッシュアルゴリズム (RIPEMD-160) を識別する定数です。
19    // これはデータの暗号化とは目的が異なり、データの整合性検証などに使用されます。
20    // PHP 8では、mhash 拡張がインストールされていれば mhash() 関数で MHASH_RIPEMD160 を使用できますが、
21    // 一般的には hash('ripemd160', $data) のように hash() 関数を使うことが推奨されます。
22
23    $cipherAlgo = 'aes-128-cbc'; // AES-128 を CBC モードで使用
24
25    // アルゴリズムに必要な鍵の長さを取得
26    $keyLength = openssl_cipher_key_length($cipherAlgo);
27    if ($keyLength === false) {
28        error_log("Invalid cipher algorithm specified: {$cipherAlgo}");
29        return false;
30    }
31
32    // 鍵の長さがアルゴリズムの要件と一致するか確認
33    if (strlen($key) !== $keyLength) {
34        error_log("Encryption key length must be exactly {$keyLength} bytes for {$cipherAlgo}. Current length: " . strlen($key) . " bytes.");
35        return false;
36    }
37
38    // IV (初期化ベクトル) の長さを取得
39    $ivLength = openssl_cipher_iv_length($cipherAlgo);
40    if ($ivLength === false) {
41        error_log("Failed to get IV length for cipher algorithm: {$cipherAlgo}");
42        return false;
43    }
44    // IVを生成 (暗号化ごとに異なるランダムな値である必要があります)
45    $iv = openssl_random_pseudo_bytes($ivLength);
46    if ($iv === false) {
47        error_log("Failed to generate random IV.");
48        return false;
49    }
50
51    // データを暗号化
52    // OPENSSL_RAW_DATA: 生データとして出力 (Base64エンコードしない)
53    $encrypted = openssl_encrypt($data, $cipherAlgo, $key, OPENSSL_RAW_DATA, $iv);
54
55    if ($encrypted === false) {
56        error_log('Encryption failed: ' . openssl_error_string());
57        return false;
58    }
59
60    // 暗号化されたデータとIVをBase64エンコードして返す (保存・転送のため)
61    // IVは復号化のために必要なので、暗号文と一緒に保存または送信する必要があります
62    $encodedEncrypted = base64_encode($encrypted);
63    $encodedIv = base64_encode($iv);
64
65    echo "--- 暗号化処理 ---" . PHP_EOL;
66    echo "オリジナルデータ: " . $data . PHP_EOL;
67    // セキュリティ上の理由から、実際の鍵は出力しません
68    echo "使用された鍵の長さ: " . strlen($key) . "バイト" . PHP_EOL;
69    echo "生成されたIV (Base64): " . $encodedIv . PHP_EOL;
70    echo "暗号化されたデータ (Base64): " . $encodedEncrypted . PHP_EOL . PHP_EOL;
71
72    // --- 復号化処理 ---
73    // 暗号化されたデータとIVをデコード
74    $decodedEncrypted = base64_decode($encodedEncrypted);
75    $decodedIv = base64_decode($encodedIv);
76
77    // データを復号化
78    $decrypted = openssl_decrypt($decodedEncrypted, $cipherAlgo, $key, OPENSSL_RAW_DATA, $decodedIv);
79
80    if ($decrypted === false) {
81        error_log('Decryption failed: ' . openssl_error_string());
82        return false;
83    }
84
85    echo "--- 復号化処理 ---" . PHP_EOL;
86    echo "復号化されたデータ: " . $decrypted . PHP_EOL . PHP_EOL;
87
88    return ['encrypted' => $encodedEncrypted, 'iv' => $encodedIv, 'decrypted' => $decrypted];
89}
90
91// --- サンプル使用 ---
92$originalData = "Hello, System Engineer Beginner!";
93// AES-128 では16バイト (128ビット) の鍵が必要です。
94// 強力な鍵を生成するには random_bytes() を使用することを推奨します。
95$encryptionKey = random_bytes(16); // 16バイトのランダムな鍵を生成
96
97echo "--- OpenSSL を使用した AES-128 暗号化・復号化 ---" . PHP_EOL;
98$result = encryptAndDecryptAES128($originalData, $encryptionKey);
99
100if ($result) {
101    if ($result['decrypted'] === $originalData) {
102        echo "✅ 復号化は成功し、元のデータと一致しました。" . PHP_EOL;
103    } else {
104        echo "❌ 復号化は成功しましたが、元のデータと一致しませんでした。" . PHP_EOL;
105    }
106} else {
107    echo "❌ 暗号化または復号化に失敗しました。エラーログを確認してください。" . PHP_EOL;
108}
109
110echo PHP_EOL . "--- MHASH_RIPEMD160 に関連する補足 (ハッシュ関数の例) ---" . PHP_EOL;
111// MHASH_RIPEMD160 はハッシュアルゴリズムを示す定数です。
112// 暗号化とは用途が異なり、データの改ざん検知などに使用されます。
113// PHP 8では、`hash()` 関数を使うことが一般的かつ推奨されます。
114$dataToHash = "This is a test string for hashing with RIPEMD-160.";
115$hashRipemd160 = hash('ripemd160', $dataToHash);
116echo "RIPEMD-160 ハッシュ ('{$dataToHash}'): " . $hashRipemd160 . PHP_EOL;
117
118// もし mhash 拡張が利用可能であれば、以下のように MHASH_RIPEMD160 を使用することもできますが、
119// PHP 8 環境では mhash 拡張はデフォルトで含まれていないことが多いです。
120// if (extension_loaded('mhash')) {
121//     $mhashHash = mhash(MHASH_RIPEMD160, $dataToHash);
122//     echo "RIPEMD-160 ハッシュ (mhash 拡張): " . bin2hex($mhashHash) . PHP_EOL;
123// }

PHP 8では、古いmcrypt拡張が削除され、OpenSSL拡張を使って安全なデータ暗号化を行います。キーワードにあるmcrypt_rijndael_128は、AES-128暗号化アルゴリズムの別名であり、このサンプルコードではOpenSSLのopenssl_encrypt関数とopenssl_decrypt関数で実装しています。

encryptAndDecryptAES128関数は、引数$dataで受け取ったデータを、引数$keyで指定された16バイトの鍵を使ってAES-128で暗号化し、その後復号化する一連の処理を行います。暗号化にはIV(初期化ベクトル)が必須で、openssl_random_pseudo_bytes関数で安全に生成されます。成功した場合、暗号化データ、IV、復号化データを含む連想配列を返し、失敗時はfalseを返します。

リファレンス情報のMHASH_RIPEMD160は、暗号化とは異なり、データの改ざん検知などに使われるハッシュアルゴリズムを識別する定数です。PHP 8では、一般的にhash()関数を使いhash('ripemd160', $data)のように利用することが推奨されます。

PHP 8では、mcrypt拡張が削除されたため、mcrypt_rijndael_128は直接利用できません。代わりにOpenSSL拡張のaes-128-cbcが推奨され、これはRijndael-128 (AES-128) と同等です。暗号化にはrandom_bytes()で生成した強力な16バイトの鍵と、毎回異なるランダムな初期化ベクトル(IV)を使用することが必須です。IVは暗号化データと共に安全に管理し、復号化時に必ず提供してください。

一方、MHASH_RIPEMD160はデータの改ざん検知などに用いるハッシュ関数であり、データそのものを読めなくする「暗号化」とは目的が異なります。PHP 8では、mhash拡張よりhash('ripemd160', $data)のように標準のhash()関数を利用するのが一般的です。これらの技術の用途の違いと、安全な鍵・IVの管理に特に注意してください。

関連コンテンツ

関連IT用語

関連プログラミング言語