>  기사  >  백엔드 개발  >  PHP 암호화 및 복호화의 내부 알고리즘은 어떻게 구현됩니까?

PHP 암호화 및 복호화의 내부 알고리즘은 어떻게 구현됩니까?

伊谢尔伦
伊谢尔伦원래의
2017-07-08 10:50:291107검색

최근 URL 점프에 대해 배울 때 아주 사용하기 쉬운 세 가지 PHP 암호화 및 복호화 기능을 발견했는데, 그 기능은 이미 디스크에 있는 것 같습니다... 이러한 암호화 및 복호화를 사용하는 이유는 때때로 URL 주소가 다음과 같기 때문입니다. 얻은 값을 누군가가 해독하려고 합니다. 콘텐츠를 찾으려면 키를 알아야 합니다. 키가 없으면 URL의 콘텐츠를 알기까지 시간이 걸립니다.

파일로 패키징하고 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>”; 
?>

핵심은 여기입니다. 다른 웹사이트로 이동하고 싶지만 세션이 올바른지 확인하고 싶다면 세션을 처리해야 합니다. 회사에는 웹사이트와 포럼이 있고 두 곳 모두 있는 것 같습니다. 회원가입을 하고 로그인을 하되, 홈페이지에 로그인 후 포럼에 접속하면 세션이 무효화되는 것을 원하지 않습니다. 즉, 한번 로그인하여 회사 전체를 운영하는 것입니다

그래서 사용자 세션을 처리하는 방법은 무엇입니까?

웹 페이지는 상태가 없습니다. 원하는 경우 새 웹 페이지에서 세션을 계속 사용하려면 세션을 한 곳에서 다른 곳으로 이동해야 한다고 생각한 사람도 있을 것입니다. URL. 그리고 PHP에는 세션을 처리하는 변수가 있습니다. 따라서 등록해야 하는 세션을 배열로 변환하면 다음과 같이 작성할 수 있습니다.

코드는 다음과 같습니다. 위의 예에서 직렬화는 먼저 $_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를 사용하여 암호를 해독한 다음 다음을 사용합니다. 데이터를 원래 데이터로 복원하려면 직렬화를 해제하세요. 이 처리 단계에서는 웹페이지가 헤더 La를 자유롭게 이동할 수 있습니다.


이 방법에는 보안 문제도 포함됩니다. 주소 전송 과정에서 다른 사람이 귀하의 URL 주소를 알아낸다면 사람들이 URL의 내용을 해독할 수 없을 수도 있지만 직접 사용할 수도 있습니다. 이 URL 주소를 사용하면 개인 계정, 이메일 계정, 심지어 은행 계좌까지 로그인할 수 있습니다(물론 저를 제외하면 이 URL을 쓰는 사람은 거의 없습니다. 하하). 하지만 실제로는 즉시 취소할 수 있습니다.

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


코드는 다음과 같습니다.

//process.php 
<?php 
session_start(); 
include “fun.php”; 
$_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey")); 
header("Location: http://$domain/index.php"); 
?>

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

$_SESSION["TIME "] = time();

이렇게 설정하는 이유는 주로 양쪽의 시간을 얻기 위함입니다. 점프가 30초 이상 걸릴 경우 login.php 로그인 페이지로 점프하도록 할 수 있습니다. 네트워크가 느린 고객 속도가 당황스러울 수 있지만 이는 예방 조치이기도 합니다. 누군가가 이 URL을 획득하고 30초 내에 로그인하지 않으면 죄송합니다. 시간 초과 후 다시 로그인하세요. $_SESSION["PASSWORD"] 이 두 개의 동동은
사용자가 로그인할 때 입력해야 하는
사용자 이름과 비밀번호입니다.
이 두 세션을 취소하는 이유는 누군가가 귀하의 URL을 입수하면 그 사람이 30초 이내에 logon.php 페이지를 방문하지만 URL 접미사 login.php가 index.php로 변경되는 한 전달된 세션은 여전히 ​​유효합니다.

위 내용은 PHP 암호화 및 복호화의 내부 알고리즘은 어떻게 구현됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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