帶時間戳演算法 類似authcode開源演算法

2021-06-21 22:11:25 字數 1946 閱讀 8873

有時候,你需要對加密的字串加上時間限制。 比如乙個小時後失效。類似這種需求, 利用開源演算法authcode會很好用, 可是它會出現一些特殊字串,並且出現解密失效的情況。   

別人的演算法看起來費勁,改起來更費勁, 不如自己寫個簡單的,直接上**

/**

* 演算法思路。

* 0、遍歷將$a的每位字元都先獲取ascii碼,再加上2,再返回該值對應的字元

* 1、獲取$a的長度 $b,再將$b轉化為16進製制。

* 2、再求$b的長度 $c,再將$c轉化為16進製制。$c的長度將為1位。因為$a的長度不允許達到16的15次幕

* 3、將使用者傳入的時間戳 加上當前時間戳得到$time.

* 4、再將使用者傳入的金鑰進行一定規則編碼得到$d ,

* 5、定義不重複的9位字串$m, 再對$time進行從後到前迴圈迴圈。

* 每次迴圈拿到 $m[$time[$i-1]] 再將其拼裝起來得到 $times。 因為$time每位的值肯定不會超過9. 所以不會有超出長度的問題

* 6、生成乙個 位數(1-10)隨機 的 隨機字串 $f

* 7、$res = $c.$times.$b.$a.$f;

* 8、再將$res 按照規則來打散及重新拼裝。如字串 12345678 ,最後一位,第一位。倒數第二位。第二位....最終得到81726354.

** 帶時間戳演算法加密(不限長度)

* @param $a 待加密字串

* @param int $time 加密時長

* @param $key 金鑰

*/public static function auth_encode($a,$time=0,$key)

$time = $time ? ($time + time()): time();

$time = (string) sprintf("%012d",$time);

$strlen = dechex(strlen($a)); //代表字串的長度

$strlen1 = dechex(strlen($strlen)); //保證字串長度的長度是一位。 因為此數最大15, 而字串的長度可達到16的15次幕。所以絕對夠用。

$times = "";

$str = "ushlpba8nd";

for($i=12;$i>0;$i--)

$res = $strlen1.$times.$strlen.$a.$key.self::rands(rand(1,10));

$return = "";

for($i=0,$n=strlen($res);$i0;$i--)

$strlen1 = hexdec(substr($return,0,1));

$times = substr($return,1,12) ;

$strlen = hexdec(substr($return,13,$strlen1)); //真正有用的字串長度

$code = substr($return,(13+$strlen1),$strlen);

$time = "";

for($i=strlen($times);$i>0;$i--)

$time = (int) $time;

if($time < time())

if(strpos(substr($return,(13+$strlen+$strlen1)),$key) ===0 )

return $code;

}else

}/**

* 隨機生成 $n位字元

* @param $n

* @return string

*/private static function rands($n)

return $returns;

}

當然此演算法並不夠完美,還是會出現特殊字元,但保證能夠完美解密

資料庫中帶時間戳資料總結

資料庫已經運用越來越廣泛,資料表中帶時間的資料記錄也越來越常見,下面對資料表中一種類似 歷史演變情況 資料集進行一系列的總結,供自己參考,供別人分享,一起學習進步。第一 背景 什麼是帶時間戳的資料表結構 下面簡稱歷史演變資料 舉例一種通人員履歷記錄 history 主鍵id 人員 staf id 單...

將時間戳轉化為帶時區的格式

將時間戳轉化為帶時區的格式例如 2021 04 19t16 33 49z 如下 import moment from moment const date newdate gettime 獲取時間戳 const utcdate moment date utc format 轉化為帶時區的格式可以封裝成...

Python版無重複檔名 帶時間戳

在工作中經常會給臨時檔案起名字,因為擔心重複命名,所以有時候都不知道起什麼名字。為此,我想了乙個辦法,就是在檔名中加入時間戳。比如原來的檔案名叫test,在test後加入當前的時間戳,這樣就能保證命名不重複。方法有了,怎麼實現?python提供了time模組,該模組中有乙個叫time 的函式,它返回...