프로젝트의 필요로 인해 "인증 코드"를 생성할 수 있는 클래스를 작성해야 합니다(인증 코드에는 주로 프로젝트의 만료 시간이 포함됩니다). 생성된 인증 코드는 파일에 기록됩니다. 프로젝트가 실행될 때마다 이때 파일의 암호문을 자동으로 읽은 다음 고유한 "키"를 사용하여 암호문을 해독하고 프로젝트의 만료 시간을 해석하는 함수를 호출합니다.
이전에는 주로 base64+md5+역방향 문자열로 직접 작성해 보았습니다. 알고리즘은 너무 단순하고 쉽게 해독될 수 있으며, 암호화 및 복호화에 있어 '키'의 중요성을 인식하지 못해 폐기됩니다.
나중에 관련 정보를 검색한 결과 PHP에 Mcrypt라는 강력한 함수 라이브러리가 내장되어 있다는 것을 알게 되었습니다.
사실 mcrypt 자체는 강력한 암호화 및 복호화 방법을 제공하며 DES, TripleDES, Blowfish(기본값), 3-WAY, SAFER-SK64, SAFER-SK128, TWOFISH, TEA, CBC, OFB, CFB 및 ECB의 RC2 및 GOST.
다음은 Baidu Encyclopedia의 "암호화 알고리즘"에 대한 간단한 설명입니다.
데이터 암호화의 기본 프로세스는 원래 일반 텍스트였던 파일이나 데이터를 특정 알고리즘에 따라 처리하여 읽을 수 없는 데이터로 만드는 것입니다. 일반적으로 "암호문"이라고 하는 코드를 사용하여 해당 키를 입력한 후에만 원본 내용을 표시할 수 있습니다. 이러한 방식으로 불법적인 사람이 데이터를 도난당하거나 읽지 못하도록 보호하려는 목적이 달성됩니다. 이 프로세스의 반대는 암호화된 정보를 원래 데이터로 변환하는 프로세스인 암호 해독입니다.
암호화 기술은 일반적으로 "대칭"과 "비대칭"의 두 가지 범주로 나뉩니다.
대칭 암호화란 암호화와 복호화가 동일한 키(보통 "세션 키"라고 함)를 사용하는 것을 의미합니다. 이 암호화 기술은 현재 널리 사용되고 있습니다. 예를 들어 미국 정부가 채택한 DES 암호화 표준이 대표적인 "대칭 암호화"입니다. "암호화 방법, 세션 키 길이는 56비트입니다.
비대칭 암호화는 암호화와 복호화가 서로 다른 키를 사용한다는 것을 의미합니다. 일반적으로 "공개 키"와 "개인 키"라는 두 개의 키가 함께 쌍을 이루어야 합니다. 그렇지 않으면 암호화가 열릴 수 없습니다. 여기서 '공개키'란 외부에 공개할 수 있다는 뜻이지만, '개인키'는 알 수 없고, 소유자만이 알 수 있다는 뜻이다. 대칭형 암호화 방식은 네트워크 상에서 암호화된 파일을 전송하는 경우 상대방에게 키를 알려주기 어렵고 어떤 방식을 사용해도 도청될 수 있다는 점에서 장점이 있다. 비대칭 암호화 방식은 키가 2개이고 '공개 키'를 공개할 수 있으므로 수신자는 복호화 시 자신의 개인 키만 사용하면 되므로 키 전송을 피할 수 있어 매우 좋습니다. 보안 문제.
앞서 언급했듯이 mcrypt는 국제적으로 공개된 다양한 알고리즘을 지원합니다. 이번 프로젝트에서는 빠르고 대용량 데이터 암호화에 적합한 대칭 알고리즘인 DES(Data Encryption Standard)를 사용했습니다.
다음으로 암호화 클래스에서 사용되는 여러 기능에 대해 간략하게 설명하겠습니다.
------------------------------- ------ -----------------------
리소스 mcrypt_module_open( string $ 알고리즘 , 문자열 $algorithm_directory , 문자열 $mode , 문자열 $mode_directory )
매개변수 $algorithm: 사용할 알고리즘, mcrypt_list_algorithms() 함수를 통해 지원되는 모든 알고리즘 이름을 볼 수 있습니다.
매개변수 $mode: 어떤 모드를 사용할지 마찬가지로 내장 함수 mcrypt_list_algorithms()를 사용하여 지원되는 모든 모드를 볼 수 있습니다
---------------------------- -------- ---------------- -----
int mcrypt_enc_get_iv_size (resource $td )
이 함수는 사용된 알고리즘의 초기화 벡터(IV)의 크기를 반환하고(약간 추상적으로 보임) IV가 다음과 같은 경우 0을 반환합니다. 알고리즘에서는 무시됩니다.
$td 매개변수는 mcrypt_module_open 함수의 반환 값입니다.
------------------------------- ------ ----------
string mcrypt_create_iv ( int $ size [, int $source = MCRYPT_DEV_RANDOM ] )
이 함수는 초기화 벡터(IV)를 생성합니다.
매개변수:
$source는 MCRYPT_RAND, MCRYPT_DEV_RANDOM,
MCRYPT_DEV_URANDOM
일 수 있습니다. 참고: PHP5. 3.0 이상, MCRYPT_RAND만 지원
반환 값:
성공하면 문자열 초기 벡터가 반환됩니다. 실패하면 False가 반환됩니다.
------------ ------ ------------------ ------ -------------
int mcrypt_enc_get_key_size (resource $td )
이 함수는 현재 알고리즘에서 지원하는 최대 키 길이(바이트)를 얻을 수 있습니다.
int mcrypt_generic_init (resource $td , string $key , string $iv )
mcrypt_generic() 또는 mdecrypt_generic()을 호출하기 전에 먼저 이 함수를 호출해야 합니다. 이 함수는 암호화된 데이터를 저장하기 위해 버퍼를 초기화하는 데 도움이 될 수 있습니다. .
$key 매개변수: 키 길이. $key의 현재 값은 mcrypt_enc_get_key_size() 함수에서 반환된 값보다 작습니다.
问题:$key的值,越大越好吗?有同学会的,帮忙解答下。
--------------------------------------------------------------------------------
string mcrypt_generic ( resource $td , string $data )
完成了前面的工作之后,就可以调用该函数用以加密数据了。
参数$data:要加密的数据内容
返回值:返回加密后的密文
--------------------------------------------------------------------------------
bool mcrypt_generic_deinit ( resource $td )
该函数能够帮我们卸载当前使用的加密模块。
返回值
成功时返回 TRUE, 或者在失败时返回 FALSE.
--------------------------------------------------------------------------------
string mdecrypt_generic ( resource $td , string $data )
该函数能够用来解密数据。
注意:解密后的数据可能比实际上的更长,可能会有后续的\0,需去掉
--------------------------------------------------------------------------------
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("~!@#$%^"); ?>
更多通过PHP的内置函数,通过DES算法对数据加密和解密相关文章请关注PHP中文网!