【ハッシュ化と暗号化】PHPで元データを変換する方法【現役エンジニアが解説】

PROGRAM

今回は、PHPで元データを変換する方法について、ハッシュ化と暗号化に分け、簡単に解説していきます。

PHPでハッシュ化する方法

ハッシュ化とは、元のデータをランダムな値に不可逆変換することです。

元に戻すことができないため、パスワードの保護やURLの短縮化等に向いています。

$member_no = '10007'; // ハッシュ化する会員番号
$hash   = hash('sha512', $member_no);
$number = hexdec($hash);
$char = array_merge(
    range('0', '9'),
    range('a', 'z'),
    range('A', 'Z')
);
$base   = count($char);
$result = "";
while ($number > 0) {
    $result = $char[ fmod($number, $base) ] . $result;
    $number = floor($number / $base);
}
$result = empty($result) ? 0 : $result; // ハッシュ化された会員番号

上記のサンプルコードは、PHPで会員番号をsha512のアルゴリズムでハッシュ化するサンプルコードです。

PHPで暗号化する方法

暗号化は、ハッシュ化とは異なり、元データを戻すこと(複合化)を前提とした変換のことです。

元に戻すことができるため、データベースに保存する個人情報や機密情報の保護等に向いています。

$key = "{encryption_key}"; // 暗号化のキー文字列
$name = "山田太郎"; // 暗号化する氏名
$ivSize = openssl_cipher_iv_length('AES-256-CBC');
$iv = openssl_random_pseudo_bytes($ivSize);
$encrypted = openssl_encrypt($name, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
$encrypted = base64_encode($iv . $encrypted); // 暗号化された氏名

上記のサンプルコードは、PHPで氏名をAES-256-CBCのアルゴリズムで暗号化するサンプルコードです。

PHPで複合化する方法

暗号化は元に戻すことを目的としています。

元に戻すためには必ず複合化の処理が必要となります。

$key = "{encryption_key}"; // 暗号化のキー文字列
$encrypted = "{encrypted_text}"; // 暗号化された文字列
$data = base64_decode($encrypted);
$ivSize = openssl_cipher_iv_length('AES-256-CBC');
$iv = substr($data, 0, $ivSize);
while (strlen($iv) < 16) {
    $iv = "0".$iv;
}
$data = openssl_decrypt(substr($data, $ivSize), 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); // 複合化された文字列

上記のサンプルコードは、PHPでAES-256-CBCのアルゴリズムで暗号化したものを複合化するサンプルコードです。