TOP書籍連動> メッセージダイジェスト関数の実装
まるごと PostgreSQL!
商用データベースに匹敵するWebシステム構築手法

第10回:メッセージダイジェスト関数の実装

著者:大垣靖男(OHGAKI, Yasuo)   2005/5/23
1   2  次のページ
メッセージダイジェスト関数の実装

   それでは、実際にメッセージダイジェスト関数の実装の仕方を解説しましょう。リスト13は、実際に実装するためのPHPスクリプトです。
リスト13:メッセージダイジェスト関数の実装
<?php
// digest.php

/** メッセージダイジェストを保存する変数名*/
define('HASH_NAME','m');
/** メッセージダイジェスト生成の秘密文字列*/
define('MAGIC','&%21q234lkajsdfbjueA)234%&$% ');
/** メッセージダイジェストの有効範囲設定*/
define('MAGIC_LIFE_ANY', 0);
define('MAGIC_LIFE_SCRIPT', 1);
define('MAGIC_LIFE_USER', 2);
define('MAGIC_LIFE_SESSION',4);


// {{{ init_hash()
/**
* 配列にメッセージダイジェストの値を追加
*
* @param array $values array(key=>vlaue)
* @param array $values_protected array(vlaue)
* @param int $magic_life See magic().
* @return array
*/
function init_hash($values, $values_protected = null, $magic_life ⇒
= MAGIC_LIFE_ANY)
{
assert(is_array($values));
if ($values_protected)
$vals = $values_protected;
else
$vals = array_keys($values);
$str = '';
foreach($vals as $k)
{
if ($k === HASH_NAME)
continue; // skip if there is hash
$str .= $k.$values[$k];
}
//echo $str;
$values[HASH_NAME] =md5($str.(magic($magic_life)));
return $values;
}
// }}}

// {{{ check_hash()
/**
* 配列と配列に埋め込まれたメッセージダイジェスト値を確認
*
* @param array $values array(key=>vlaue)
* @param array $values_protected array(vlaue)
* @param int $magic_life See magic().
* @return bool TRUE for ok, FALSE for NG
*/

function check_hash($values, $values_protected = null, $magic_life ⇒
= MAGIC_LIFE_ANY)
{
assert(is_array($values));
if (!isset($values[HASH_NAME])) {
return false;
}
if ($values_protected)
$vals = $values_protected;
else
$vals = array_keys($values);

$str = '';
foreach($vals as $k)
{
if ($k === HASH_NAME)
continue; // skip if there is hash
$str .= $k.$values[$k];
}
$hash = md5($str.(magic($magic_life)));
//echo $str;
if ($values[HASH_NAME] !== $hash) {
return false;
}
return true;
}
// }}}

// {{{ magic()
/**
* メッセージダイジェスト用の秘密の文字列の生成。
* 特定のセッション、ユーザー、スクリプト用に秘密も文字列を生成。
*
* @param integer $life magic's life time (See constant MAGIC_*)
* @return string Magic string
*/

function magic($life = MAGIC_LIFE_ANY)
{
assert(is_integer($life));
$magic = MAGIC; // static magic string
if ($life & MAGIC_LIFE_SESSION)
$magic .= session_id();
if (($life & MAGIC_LIFE_USER) && is_object($_SESSION['auth']))
$magic .= $_SESSION['auth']->uid; // ユーザー名など
if ($life & MAGIC_LIFE_SCRIPT)
$magic .= $_SERVER['PHP_SELF'];
return $magic;
}
// }}}

?>
1   2  次のページ

書籍紹介
まるごと PostgreSQL! Vol.1
まるごと PostgreSQL! Vol.1 日本での市場シェアNo.1(オープンソースRDBMS部門)データベースソフトPostgreSQLの最新情報を、開発メンバーを含む豪華執筆陣が多面的かつ詳細に解説します。PostgreSQL用クラスタリング/レプリケーションソフト、PostgreSQL⇔Oracle移行、PostgreSQLによる大規模サイト構築法、新バージョンPostgreSQL 8.0先行レビュー、PostgreSQL用.NETデータプロバイダ等々、他では読めない貴重な記事が満載です。
発売日:2004/12/08発売
定価:\1,890(本体 \1,800+税)
大垣 靖男
著者プロフィール
大垣靖男(OHGAKI, Yasuo)
University of Denver卒。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て、エレクトロニック・サービス・イニシアチブ有限会社を設立。Linuxはバージョン0.9xの黎明期から利用してるが、オープンソースシステム開発やコミュニティへの参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトのPostgreSQLモジュールのメンテナ、日本PostgreSQLユーザ会の四国地域での活動等を担当している。


INDEX
第10回:メッセージダイジェスト関数の実装
メッセージダイジェスト関数の実装
  メッセージダイジェスト関数を利用するサンプル