PHPで変なテキトーなパスワードハッシュの作り方 var.20200713 | TheoryOfContraints official blog

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));