PHPで変なテキトーなパスワードハッシュの作り方 var.20200713
パスワードハッシュプログラムの改良版を作った。
i*でunpuckして、暗号化後、i*のpackで戻して。それを暗号化すると元へ戻るのは面白い
ライセンスは、てきとーなMITライセンスで良いので
- 以下、ソースリスト ------
<?php
class Password {
static $seed;
static $OriginSeed;
static $HashHash;
static function SetSeed($seed) {
self::$seed = $seed;
self::$OriginSeed = $seed;
self::$HashHash = "efgsdsegew";
}
static function ResetSeed() {
self::$seed = self::$OriginSeed;
}
static function Lcg($x, $y) {
self::$seed = floor(self::$seed / 10000);
$x = $x | 1; // 奇数で掛ける
if ($x >= 10000) {
$x = 9999;
}
if ($y >= 10000) {
$y = 9999;
}
self::$seed = self::$seed * $x + $y;
}
static function Not() {
self::$seed = ~self::$seed;
}
static function Xor($x) {
self::$seed = self::$seed ^ $x;
}
static function XorLeft($x) {
if ($x > 16) {
$x = 16;
}
$x = self::$seed << $x;
self::$seed = self::$seed ^ $x;
}
static function XorRight($x) {
if ($x > 16) {
$x = 16;
}
$x = self::$seed >> $x;
self::$seed = self::$seed ^ $x;
}
static function RndSeed() {
// 適当なランダム処理
self::Lcg(3202, 1233); // 乗算+加算から始めるのがセオリーらしい
self::Not();
self::Xor(904845396);
self::Not();
self::Xor(12345678901234567);
self::XorRight(15);
// エラーチェック
if (is_float(self::$seed)) {
echo("Error: Float."); exit;
//self::$seed = self::$OriginSeed;
}
if (self::$seed == 0) {
self::$seed = self::$OriginSeed;
}
return self::$seed;
}
static function MakeHash ($password, $seed) {
self::SetSeed($seed);
$data = unpack("i*", $password);
$password = "";
foreach ($data as $value) {
$value ^= self::RndSeed();
$password .= pack("i*", $value);
}
return hash_hmac('ripemd160', $password, self::$HashHash);
}
// 参考URL
// https://qiita.com/k_nitadori/items/42970f850d5e2cffdff7
}
echo(Password::MakeHash("password", 1234567890));