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和经过哈希处理的密码保存到数据库中。
从字符串中获取哈希值