我正在尝试将数字混淆/加密成字符串,然后再次想要对该字符串进行解复用/解密以获取数字。
我无法使用base64或任何其他公共可用的算法,因为生成的哈希将是个人的并且特定于每个用户,并且不能与其他用户共享,用于创建将包含个人哈希的个人URL。
基本上我想从userid生成哈希值,因为userid是唯一的并且没有变化。
到目前为止,我已经创建了自定义函数来加密用户ID并从中获取哈希值。
<?php
$base_encryption_array = array(
'0'=>'b76',
'1'=>'d75',
'2'=>'f74',
'3'=>'h73',
'4'=>'j72',
'5'=>'l71',
'6'=>'n70',
'7'=>'p69',
'8'=>'r68',
'9'=>'t67',
'a'=>'v66',
'b'=>'x65',
'c'=>'z64',
'd'=>'a63',
'e'=>'d62',
'f'=>'e61',
'g'=>'h60',
'h'=>'i59',
'i'=>'j58',
'j'=>'g57',
'k'=>'f56',
'l'=>'c55',
'm'=>'b54',
'n'=>'y53',
'o'=>'w52',
'p'=>'u51',
'q'=>'s50',
'r'=>'q49',
's'=>'o48',
't'=>'m47',
'u'=>'k46',
'v'=>'i45',
'w'=>'g44',
'x'=>'e43',
'y'=>'c42',
'z'=>'a41'
);
function my_custom_encode($string){
global $base_encryption_array ;
$string = (string)$string;
$length = strlen($string);
$hash = '';
for ($i=0; $i<$length; $i++) {
if(isset($string[$i])){
$hash .= $base_encryption_array[$string[$i]];
}
}
return $hash;
}
function my_custom_decode($hash){
global $base_encryption_array ;
/* this makes keys as values and values as keys */
$base_encryption_array = array_flip($base_encryption_array);
$hash = (string)$hash;
$length = strlen($hash);
$string = '';
for ($i=0; $i<$length; $i=$i+3) {
if(isset($hash[$i]) && isset($hash[$i+1]) && isset($hash[$i+2]) && isset($base_encryption_array[$hash[$i].$hash[$i+1].$hash[$i+2]])){
$string .= $base_encryption_array[$hash[$i].$hash[$i+1].$hash[$i+2]];
}
}
return $string;
}?>
到目前为止一切正常。 加密适用于多个级别/迭代。
多个迭代哈希的解密不起作用,它只适用于单个加密值而不适用于加密值的2倍。
例如。 我的php函数从userid创建多个迭代哈希,我使用2次这样的加密。
<?php
function userid_to_hash($userid){
for($i = 1; $i <= 2; $i++) {
$userid = my_custom_encode($userid);
}
/* it returns hash*/
return $userid;
}?>
和我的多次迭代解码函数
让我们说userid = 41;
所以当我这样做时
<?php
$userid = 41;
echo userid_to_hash($userid)."<br>";
?>
我得到输出
g57p69f74a63p69l71
但是当我想解密哈希并获得用户ID时,我得到空白。像这样
<?php
$hash = 'g57p69f74a63p69l71';
echo hash_to_userid($hash);
?>
我得到空白页面。但是,如果我将$ hash设置为单级解密并使用自定义函数my_custom_decode ,那么它可以在单次迭代中正常工作。
<?php
$hash = 't67';
echo my_custom_decode($hash);
?>
给出正确的输出。 的 9
答案 0 :(得分:21)
“PHP自定义双向加密和解密”, 我做错了什么?
您正在尝试编写自定义加密。
答案 1 :(得分:8)
i cant use base64 or any other public available algorithmbs as the generated hash is gonna be personal and specific to each user and cant be shared with other users, its for creating personal urls which will contains the personal hash.
You're missing the point of encryption:
To that effect: Recommended PHP cryptography libraries传递多个变量。
编辑2017-10-17:
用于创建包含个人哈希的个人网址。
对不起,我在最初的答案中错过了你的问题的这一部分。
加密甚至不是obfuscating database IDs from GET requests工作的正确工具。您希望使用随机生成的令牌/单独查找。
答案 2 :(得分:1)
您应该考虑使用加密库。
您的问题的答案是因为您正在使用全局变量。
这样做真的是一种不好的做法:
global $base_encryption_array ;
/* this makes keys as values and values as keys */
$base_encryption_array = array_flip($base_encryption_array);
你继续翻转阵列,在你的第二个循环中(当你尝试解码时),它不能再找到键,因为你翻了两次。
丑陋的快速修复,只需在my_custom_decode中重命名数组变量。