我有一个简单的双向加密方法,可以生成加密的字符串。该方法如下:-
public function cryption($string, $action = 'e')
{
$secret_key = 'secret-key';
$secret_iv = 'secret_iv';
$output = false;
$encrypt_method = "AES-256-CBC";
$key = hash( 'sha256', $secret_key );
$iv = substr( hash( 'sha256', $secret_iv ), 0, 16 );
if( $action == 'e' ){
$output = openssl_encrypt( $string, $encrypt_method, $key, 0, $iv );
}else if( $action == 'd' ){
$output = openssl_decrypt( $string, $encrypt_method, $key, 0, $iv );
}
return $output;
}
问题是,它创建了这样的字符串-
yTJbtH7mIJjhY+SatnTxY5i2jt/qUW+nZgmGBeBgZEzpy2GMSBQgDjKeyjxGOdJd
此类加密密钥具有像/
和+
这样的字符。我想要一种简单的双向加密方式,该方式可以生成仅包含字母数字字符的字符串。
注意:此字符串将作为参数发送到Codeigniter控制器方法。带有斜线意味着在斜线之后的字符串部分将被视为一个单独的参数。
答案 0 :(得分:1)
我不是加密专家,所以我无法判断是否有一种加密或哈希方法在其加密/哈希输出中仅生成字母数字字符。
但是,我相信我可以帮助您解决潜在的问题。这是转义派上用场的典型情况之一。在下文中,我将提供一个过于简化的示例,以说明该概念。
因此,让我们假设+
字符是唯一的禁止字符,并且您的密码功能已输出字符串ab+cyk
;这就是您代码中$output
的值。
现在让我们定义以下字符序列替换:
+ <-> ya
即您将在发送$output
之前对其进行进一步的处理,其中+
被ya
取代。这样,您已经从$ output中消除了所有+
个字符。
当代码初始化控制器接收到该字符串时,它首先进行反向转义(转义),并应用相反的过程。在这种情况下,它将用ya
替换所有出现的+
,以取回原始的加密字符串,然后可以(以密码方式)解密结果。
现在我们快到了,但是还有一个问题。当前,接收器(控制器)无法区分接收到的字符串中的字符序列ya
的确是ya
还是+
。
如果我们定义另一个替换项,则发送方和接收方必须应用该替换项,我们可以解决该问题:
y <-> yy
现在,当控制器在接收到的字符串中遇到字符序列ya
时,它将是明确的。这将意味着+
,因为原始序列ya
将被转义为yya
(编码)。
回到我们过于简化的示例,字符串ab+cyk
在发送方将变成abyacyyk
,并且可以被接收方(控制器)明确解码。
此原理(带有变体)已应用于无数标准和软件开发中。我立即想到的最著名的是C(反斜杠在字符串常量中有特殊含义,因此反斜杠是转义字符)和URI的转义(其中百分号是转义字符)。
当然,在我们的示例中,y
字符是转义字符。请注意,如果我们想要字面意义上的转义字符,我们不建议加倍。这只是一个随机(尽管很频繁)的选择。在我们的示例中,我们本可以通过y
或其他方式而不是yz
来使yy
转义。
鉴于您的声誉,我相信您可以在几分钟内编写适当的编码和解码功能,并且可以轻松地将示例扩展为也转义其他不需要的字符(例如,转义/
为yb
)。如果您需要帮助,请发表评论,我会在答案中添加适当的伪代码。
但是最终,已经有一个解决方案:如果您可以在发送方发送给接收方(控制器)的字符串中接受百分号(%
),则可以简单地使用URI转义。
这里的关键是,我所知道的每种(脚本)语言都具有模块或什至是核心功能,它们可靠,舒适地(最后但并非最不重要)进行URI转义和转义(也称为URI编码和解码)。在大多数情况下,您甚至可以告诉那些模块/函数您想转义哪些字符,而如果您想偏离通常的字符集,则不需要。
此解决方案的唯一缺点是,它可能会增加有效负载的大小,并且在实际编码有效负载之前无法预测大小。
例如,如果我们如上所述进行编码和解码,则如果字符串仅包含+
和y
字符,则字符串的大小将在编码时加倍。如果我们将使用URI编码,则字符串大小甚至可以增加三倍(因为要转义的字符将由百分号和字符的十六进制代码代替,即A
将由{{1}代替}(例如(如果%41
在要替换的字符集中))。
考虑到当今的带宽,存储,RAM速度和CPU能力,我认为这对您来说不是真正的问题。