>  기사  >  백엔드 개발  >  PHP 암호화 및 복호화 내부 알고리즘

PHP 암호화 및 복호화 내부 알고리즘

高洛峰
高洛峰원래의
2016-12-21 09:57:071295검색

파일로 압축하고 fun.php라고 부릅니다.

<?php 
function passport_encrypt($txt, $key) { 
srand((double)microtime() * 1000000); 
$encrypt_key = md5(rand(0, 32000)); 
$ctr = 0; 
$tmp = &#39;&#39;; 
for($i = 0;$i < strlen($txt); $i++) { 
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr; 
$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]); 
} 
return base64_encode(passport_key($tmp, $key)); 
} 

function passport_decrypt($txt, $key) { 
$txt = passport_key(base64_decode($txt), $key); 
$tmp = &#39;&#39;; 
for($i = 0;$i < strlen($txt); $i++) { 
$md5 = $txt[$i]; 
$tmp .= $txt[++$i] ^ $md5; 
} 
return $tmp; 
} 

function passport_key($txt, $encrypt_key) { 
$encrypt_key = md5($encrypt_key); 
$ctr = 0; 
$tmp = &#39;&#39;; 
for($i = 0; $i < strlen($txt); $i++) { 
$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr; 
$tmp .= $txt[$i] ^ $encrypt_key[$ctr++]; 
} 
return $tmp; 
} 
?>

다음은 세 가지 암호화 및 복호화 기능에 대한 이해를 돕기 위한 몇 가지 예입니다.

//string.php 
<?php 
include “fun.php”; 

$txt = “This is a test”; 
$key = “testkey”; 
$encrypt = passport_encrypt($txt,$key); 
$decrypt = passport_decrypt($encrypt,$key); 

echo $txt.”<br><hr>”; 
echo $encrypt.”<br><hr>”; 
echo $decrypt.”<br><hr>”; 
?> 

//array.php 
<?php 
include “fun.php”; 

$array = array( 
"a" => "1", 
"b" => "2", 
"c" => "3", 
"d" => "4" 
); 
//serialize产生一个可存储的值,返回一个字符串,unserialize还原 
$txt = serialize($array); 
$key = “testkey”; 
$encrypt = passport_encrypt($txt,$key); 
$decrypt = passport_decrypt($encrypt,$key); 
$decryptArray = unserialize($decrypt); 

echo $txt.”<br><hr>”; 
echo $encrypt.”<br><hr>”; 
echo $decrypt.”<br><hr>”; 
echo $decryptArray.”<br><hr>”; 
?>

핵심 포인트 여기에서 다른 웹사이트로 이동하고 싶지만 세션이 올바른지 확인하려면 회사에 웹사이트와 포럼이 있고 두 곳 모두 등록과 로그인이 있는 것 같습니다. 홈페이지 로그인 후 포럼에 접속했을 때, 즉 한 번 로그인하여 회사 전체를 운영할 때 사용자의 세션이 무효화되는 것을 원하지 않습니다

그럼 사용자 세션을 어떻게 처리해야 할까요? 🎜>
웹 페이지는 모두 Stateless입니다. 새 웹 페이지에서 세션을 계속 사용하려면 세션을 한 곳에서 다른 곳으로 옮겨야 한다고 생각한 사람도 있을 것입니다. 그리고 PHP에는 $_SESSION이라는 세션을 처리하는 변수가 있으므로 등록해야 하는 세션을 배열로 변환하면 다음과 같이 작성할 수 있습니다. 🎜>위의 예에서는 먼저 serialize를 사용하여 $_SESSION을 다음으로 변경합니다. 저장할 수 있는 데이터는 Passport_encrypt를 통해 암호화됩니다. urlencode를 추가하는 이유는 $_SESSION을 암호화할 때 예상치 못한 인코딩이 생성될 수 있기 때문입니다. (매우 효과적인 것으로 밝혀졌습니다)

처리하려면 먼저
//login.php 
<?php 
session_start(); 
include “fun.php”; 
$_SESSION[“userid”]; 
$_SESSION[“username”]; 
$_SESSION[“userpwd”]; 

header("Location: http://$domain/process.php?s=".urlencode(passport_encrypt(serialize($_SESSION),"sessionkey"))); 
?>


$_GET["s"]를 사용하여 URL의 매개변수를 가져온 다음 Passport_decrypt를 사용하여 암호를 해독합니다. , 직렬화 해제를 사용하여 데이터를 원래 데이터로 복원합니다. 이 처리 단계에서 웹페이지는 헤더를 자유롭게 이동할 수 있습니다.

이 방법에도 보안 문제가 있습니다. 주소 전송 과정에서 다른 사람이 귀하의 URL 주소를 알아낸다면, 사람들은 URL의 내용을 해독하지 못할 수도 있습니다. 또한 이 URL 주소를 사용하여 일부 개인 계정, 이메일 계정, 심지어 은행 계좌에 로그인할 수도 있습니다(물론 이렇게 쓰는 사람은 거의 없습니다. 저는 예외입니다. 하하). , 페이지를 이동하여 세션을 취소할 수 있습니다.
//process.php 
<?php 
session_start(); 
include “fun.php”; 
$_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey")); 
header("Location: http://$domain/index.php"); 
?>

다음은 process.php의 향상된 버전입니다


이 파일을 작성하기 전에 로그인 측을 설정해야 합니다.

$ _SESSION["TIME"] = time();
<?php 
session_start(); 
include_once "fun.php"; 
$_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey")); 
if((time()-$_SESSION["TIME"])>30){ 
header("Location: http://$domain/ login.php"); 
unset($_SESSION["USERNAME"]); 
unset($_SESSION["PASSWORD"]); 
} 
else 
header("Location: http://$domain/ index.php"); 
?>


이렇게 설정하는 주된 이유는 점프 시간이 30초를 초과하는 경우, login.php 로그인 페이지는 네트워크 속도가 느린 고객에게 당황스러울 뿐만 아니라 누군가가 이 URL을 획득하고 30초 이내에 로그인하지 않는 경우에도 방지하므로 당황스럽고 사용자는 시간 초과 후 다시 로그인해야 합니다.

$_SESSION["USERNAME"] 및 $_SESSION["PASSWORD"]는 사용자가 로그인할 때 입력해야 하는 사용자 이름과 비밀번호입니다. 이 두 세션을 취소하는 것은 누군가가 귀하의 URL을 획득한 경우 해당 사람이 30초 이내에 login.php 페이지로 이동하더라도 URL 접미사 login.php가 변경되는 한 전달된 세션은 여전히 ​​유효하기 때문입니다. index.php에 로그인해도 여전히 성공적으로 로그인할 수 있습니다.




PHP 암호화 및 복호화 내부 알고리즘과 관련된 더 많은 글은 PHP 중국어 홈페이지를 주목해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.