プロジェクトのニーズにより、「認可コード」を生成できるクラスを記述する必要があります(認可コードには主にプロジェクトの有効期限が含まれます)。生成された認可コードは、毎にファイルに書き込まれます。プロジェクトの実行時に、ファイル内の暗号文が自動的に読み取られ、一意の「キー」を使用して関数が呼び出され、暗号文が復号化され、プロジェクトの有効期限が解釈されます。
以前、主にbase64+md5+reverse stringを自分で書いてみました。このアルゴリズムは単純すぎるため簡単に解読され、暗号化と復号化における「鍵」の重要性を認識できていないため、放棄されました。
その後、関連情報を検索したところ、Mcrypt という強力な関数ライブラリが PHP に組み込まれていることがわかりました。
実際、mcrypt 自体は強力な暗号化および復号化メソッドを提供し、DES、TripleDES、Blowfish (デフォルト)、3-WAY、SAFER-SK64、SAFER-SK128、TWOFISH、TEA、RC2、およびCBC、OFB、CFB、ECB の GOST。これは百度百科事典の「暗号化アルゴリズム」の説明からの簡単な引用です:
データ暗号化の基本プロセスは、元々プレーンテキストだったファイルやデータを特定のアルゴリズムに従って処理し、通常は「暗号文」と呼ばれる判読不能なコードに変換し、対応する暗号文を入力した後にのみ暗号化できるようにすることです。この方法によってのみ、元のコンテンツが表示され、不正な人物によるデータの盗難や読み取りを防ぐという目的が達成されます。 このプロセスの逆は復号化であり、エンコードされた情報を元のデータに変換するプロセスです。
暗号化テクノロジーは通常、「対称」と「非対称」の 2 つのカテゴリに分類されます。
対称暗号化とは、暗号化と復号化に通常「セッション キー」と呼ばれる同じキーを使用することを意味します。たとえば、米国政府が採用している DES 暗号化標準は、典型的な「対称」暗号化方式です。セッションキーの長さは 56 ビットです。
非対称暗号化とは、暗号化と復号化で異なるキーを使用することを意味します。通常、「公開キー」と「秘密キー」と呼ばれる 2 つのキーがあり、それらをペアにする必要があります。そうしないと、暗号化されたファイルを開くことができません。ここでの「公開鍵」は外部に公開できることを意味しますが、「秘密鍵」は外部に公開できず、所有者のみが知ることができます。ここに対称暗号方式の優位性があり、暗号化されたファイルをネットワーク上に送信する場合、どの方法を使っても相手に鍵を伝えることが難しく、盗聴される可能性がある。非対称暗号化方式は鍵が 2 つあり、「公開鍵」を公開できるため、受信者は復号するときに自分の秘密鍵を使用するだけで済み、鍵の送信を回避できる点が非常に優れています。セキュリティ上の問題。
前述したように、mcrypt はさまざまな国際的に公開されているアルゴリズムをサポートしています。このプロジェクトでは、高速で大量のデータの暗号化に適した対称アルゴリズムである DES (Data Encryption Standard) を使用しました。
使用されるいくつかの暗号化関数の紹介
1. リソース mcrypt_module_open (文字列 $algorithm 、文字列 $algorithm_directory 、文字列 $mode 、文字列 $mode_directory )
この関数は初期化ベクトル (IV) を作成します
パラメータ: $source には MCRYPT_RAND、MCRYPT_DEV_RANDOM、MCRYPT_DEV_URANDOM を指定できます
注: PHP5.3.0 以降は MCRYPT_RAND のみをサポートします
戻り値: 成功した場合は、文字列の初期ベクトルが返されます。失敗した場合は、False が返されます。
4. int mcrypt_enc_get_key_size (リソース $td )
この関数は、現在のアルゴリズムでサポートされている最大キー長(バイト単位)を取得できます
int mcrypt_generic_init (リソース $td 、文字列 $key 、文字列 $iv )
mcrypt_generic() または mdecrypt_generic() を呼び出す前に、この関数を最初に呼び出す必要があります。この関数は、暗号化されたデータを保存するためのバッファーを初期化するのに役立ちます。
パラメータ $key: キーの長さ $key の現在の値は関数 mcrypt_enc_get_key_size() によって返される値より小さいことに注意してください。
質問: $key の値は大きいほど良いのでしょうか?同級生会があれば、この質問に答えるのを手伝ってください。5. 文字列 mcrypt_generic (リソース $td 、文字列 $data )
前の作業が完了したら、この関数を呼び出してデータを暗号化できます。
パラメータ $data: 暗号化されるデータの内容
返回值:成功时返回 TRUE, 或者在失败时返回 FALSE.
7. string mdecrypt_generic ( resource $td , string $data )
该函数能够用来解密数据。
注意:解密后的数据可能比实际上的更长,可能会有后续的\0,需去掉
8. bool mcrypt_module_close ( resource $td )
关闭指定的加密模块资源句柄
返回值:成功时返回 TRUE, 或者在失败时返回 FALSE.
<?php class authCode { public $ttl;//到期时间 时间格式:20120101(年月日) public $key_1;//密钥1 public $key_2;//密钥2 public $td; public $ks;//密钥的长度 public $iv;//初始向量 public $salt;//盐值(某个特定的字符串) public $encode;//加密后的信息 public $return_array = array(); // 返回带有MAC地址的字串数组 public $mac_addr;//mac地址 public $filepath;//保存密文的文件路径 public function __construct(){ //获取物理地址 $this->mac_addr=$this->getmac(PHP_OS); $this->filepath="./licence.txt"; $this->ttl="20120619";//到期时间 $this->salt="~!@#$";//盐值,用以提高密文的安全性 // echo "<pre class="brush:php;toolbar:false">".print_r(mcrypt_list_algorithms ()).""; // echo "
".print_r(mcrypt_list_modes()).""; } /** * 对明文信息进行加密 * @param $key 密钥 */ public function encode($key) { $this->td = mcrypt_module_open(MCRYPT_DES,'','ecb',''); //使用MCRYPT_DES算法,ecb模式 $size=mcrypt_enc_get_iv_size($this->td);//设置初始向量的大小 $this->iv = mcrypt_create_iv($size, MCRYPT_RAND);//创建初始向量 $this->ks = mcrypt_enc_get_key_size($this->td);//返回所支持的最大的密钥长度(以字节计算) $this->key_1 = substr(md5(md5($key).$this->salt),0,$this->ks); mcrypt_generic_init($this->td, $this->key_1, $this->iv); //初始处理 //要保存到明文 $con=$this->mac_addr.$this->ttl; //加密 $this->encode = mcrypt_generic($this->td, $con); //结束处理 mcrypt_generic_deinit($this->td); //将密文保存到文件中 $this->savetofile(); } /** * 对密文进行解密 * @param $key 密钥 */ public function decode($key) { try { if (!file_exists($this->filepath)){ throw new Exception("授权文件不存在"); }else{//如果授权文件存在的话,则读取授权文件中的密文 $fp=fopen($this->filepath,'r'); $secret=fread($fp,filesize($this->filepath)); $this->key_2 = substr(md5(md5($key).$this->salt),0,$this->ks); //初始解密处理 mcrypt_generic_init($this->td, $this->key_2, $this->iv); //解密 $decrypted = mdecrypt_generic($this->td, $secret); //解密后,可能会有后续的\0,需去掉 $decrypted=trim($decrypted) . "\n"; //结束 mcrypt_generic_deinit($this->td); mcrypt_module_close($this->td); return $decrypted; } }catch (Exception $e){ echo $e->getMessage(); } } /** * 将密文保存到文件中 */ public function savetofile(){ try { $fp=fopen($this->filepath,'w+'); if (!$fp){ throw new Exception("文件操作失败"); } fwrite($fp,$this->encode); fclose($fp); }catch (Exception $e){ echo $e->getMessage(); } } /** * 取得服务器的MAC地址 */ public function getmac($os_type){ switch ( strtolower($os_type) ){ case "linux": $this->forLinux(); break; case "solaris": break; case "unix": break; case "aix": break; default: $this->forWindows(); break; } $temp_array = array(); foreach( $this->return_array as $value ){ if (preg_match("/[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f]/i",$value,$temp_array )){ $mac_addr = $temp_array[0]; break; } } unset($temp_array); return $mac_addr; } /** * windows服务器下执行ipconfig命令 */ public function forWindows(){ @exec("ipconfig /all", $this->return_array); if ( $this->return_array ) return $this->return_array; else{ $ipconfig = $_SERVER["WINDIR"]."\system32\ipconfig.exe"; if ( is_file($ipconfig) ) @exec($ipconfig." /all", $this->return_array); else @exec($_SERVER["WINDIR"]."\system\ipconfig.exe /all", $this->return_array); return $this->return_array; } } /** * Linux服务器下执行ifconfig命令 */ public function forLinux(){ @exec("ifconfig -a", $this->return_array); return $this->return_array; } } $code=new authCode(); //加密 $code->encode("~!@#$%^"); //解密 echo $code->decode("~!@#$%^"); ?>