PHP 哈希函数

首先

只需要一种选择,以下是对原文的中文本地化改写:
・对PHP有兴趣并关注安全性的人
・对哈希算法和哈希函数不熟悉的人

哈希是什么?

哈希是一种基于算法将不可读的字符串等替换成的机制。

在处理诸如密码等机密信息时使用。

著名的哈希函数

PHP有一个默认的函数,可以用于计算并生成字符串的哈希值。

※以下是一些代表性的哈希函数。

ハッシュ関数詳細hash指定したアルゴリズムで、ハッシュ値を生成する ※バージョン 5.1.2以降md5MD5方式で、16進数・32文字のハッシュ値を生成するsha1SHA-1方式で、16進数・40文字のハッシュ値を生成するpassword_hash機密性の高い文字列のハッシュ値を生成する ※バージョン 5.5以降

哈希

<?php 
$str = 'hoge';
var_dump(hash("sha256", $str));
 ?>
string(64) "ecb666d778725ec97307044d642bf4d160aabb76f56c0069c71ea25b1e926825"       

md5的含义

<?php
$str = 'hoge';
var_dump(md5($str));
 ?>
string(32) "a577f0035386e7d04551e867b3d9f024"               

SHA1:SHA1(Secure Hash Algorithm 1)是一种加密算法。

<?php
$str = 'hoge';
var_dump(sha1($str));
 ?>
string(40) "31f30ddbcb1bf8446576f0e64aa4c88a9f055e3c"          

密码哈希

<?php 
// ハッシュ値を計算する前の文字列
$str = "hoge";

// ハッシュ値を計算
password_hash($str, PASSWORD_DEFAULT);
 ?>
string(60) "$2y$10$zgsW6rm.9wcBnkSw2/Jp3OiJSDy5gsEUAM6fum4zva7/5jauNVixK"        

赠品程序

我创建了一个程序,允许输入ID和密码,并将其保存到数据库中。值得一提的是,密码使用了password_hash进行了哈希加密。

※本次使用的数据库信息

ユーザー名DB名カラム名情報①カラム名情報②id_pass_userhashdbid_data varchar(100)pass_data varchar(100)

由於新建立的用戶沒有權限,因此需要使用以下命令進行授權。在這個例子中,授權將在id_pass_user資料庫級別(hashdb)進行。

mysql> grant all on hashdb.*to id_pass_user@localhost;

请输入您的ID和密码。

IDパスワードhogeIDhogePASS

代码列表
程序列表
编码清单
程式清单
代碼列表

<?php
// ID,パスワードと、DBのバリデーションの補助を実装したクラス
class DataVaildataion {

    //ID,パスワードと、DBのバリデーションに必要なデータをカプセル化
    private $hash_pass = null;
    private $success_message = null;
    private $error_message = null;
    private $clean = array();


    # ゲッターは今回必要ないので、コメントアウト

    /*public function getHashPass() {
        return $this->hash_pass;
    }

    public function getSuccessMessage() {
        return $this->success_message;
    }

    public function getErrorMessage() {
        return $this->error_message;
    }

    public function getClean() {
        return $this->clean;
    }*/

    // セッターで、ID,パスワードのバリデーションの補助    
    public function setHashPass($hash_pass) {
        return $this->hash_pass = $hash_pass;
    }

    public function setSuccessMessage($success_message) {
        return $this->success_message = $success_message;
    }

    public function setErrorMessage($error_message) {
        return $this->error_message = $error_message;
    }

    public function setClean($clean) {
        return $this->clean = $clean;

    }
}
 ?>
<?php
// 必要なプロパティのあるクラスファイルの呼び出しと、インスタスの生成
require_once('data_vaildataion.php');
require_once('from.php');
$data = new DataVaildataion(); 

// データベースの接続情報を定数で実装
define( 'DB_HOST', '127.0.0.1'); # phpadminの場合は、localhost
define( 'DB_USER', 'id_data_user');
define( 'DB_PASS', '各自のパスワード');
define( 'DB_NAME', 'hashdb');


// Dataクラスのセッターを使用し、ID,パスワードのバリデーションを実装
if(!empty($_POST['btn_submit'])) {

    if(empty($_POST['id_data']) || empty($_POST['pass_data'])) {
        echo $data->setErrorMessage('IDまたは、パスワードが未入力です。').PHP_EOL;
        exit();
    }else {

        // Dataクラスのセッターを使用し、IDのサニタイズの実装 (シングルクフォートと、ダブルクフォートをHTMLに変換しない)
        $data->setClean($clean['id_data'] = htmlspecialchars( $_POST['id_data'], ENT_QUOTES));

        // 上記と同じく、パスワードのサニタイズの実装
        $data->setClean($clean['pass_data'] = htmlspecialchars($_POST['pass_data'], ENT_QUOTES));

        // セキリュティを考慮し、password_hashを採用(同じハッシュを生成しない。DBとの比較の際は、password_verifyを採用)
        $data->setHashPass($hash_pass['hash_pass'] = password_hash($clean['pass_data'], PASSWORD_DEFAULT));
    }

    // Dataクラスのセッターを使用し、DBのバリデーションを実装後、DBに保存
    if(empty($data->setErrorMessage($error_message)) ) {

        $mysqli = new mysqli( DB_HOST, DB_USER, DB_PASS, DB_NAME);
        if($mysqli->connect_errno ) {
            echo $data->setErrorMessage('エラー番号 '.$mysqli->connect_errno).PHP_EOL;
            exit();
        }else{
            $sql = "INSERT INTO hash (id_data, pass_data) VALUES ( '$data->setClean($clean[id_data])', '$data->setClean($hash_pass[hash_pass])')";
        }

        $res = $mysqli->query($sql);
        if($res) {
            echo $data->setSuccessMessage('登録が完了しました。');
        }else{
            echo $data->setErrorMessage('登録に失敗しました。');
        }
        $mysqli->close();
    }
}
?>
<?php
require_once('data_vaildataion.php');
?>

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>ハッシュ化しよう</title>
</head>
<body>
    <h1>新規登録画面</h1>
    <div class="input_area">
        <form action="db.php" method="post">
            <dl class="id">
                <dt>ID</dt>
                <dd><input type="text" name="id_data"></dd>
            </dl>
            <dl class="pass">
                <dt>PASS</dt>
                <dd><input type="text" name="pass_data"></dd>
            </dl>
             <input type="submit" name="btn_submit" value="新規登録">
        </form>
    </div>
</body>
</html>
+----+---------+----------------------------------------------------------------+
| id | id_data | pass_data                                                      |
+----+---------+----------------------------------------------------------------+
|  1 | (hogeID)  | ($2y$10$0V2iu9qPDLJ/LOo629jT2OSNWlEHqUzADek23k.Ns.swWZiT3GRxu) |
+----+---------+----------------------------------------------------------------+

在上述代码中,可以将ID和经过哈希处理的密码保存到数据库中。

从字符串中获取哈希值

广告
将在 10 秒后关闭
bannerAds