Encryption 简单的双向加密,生成无特殊字符的加密密钥

Encryption 简单的双向加密,生成无特殊字符的加密密钥,encryption,codeigniter-2,Encryption,Codeigniter 2,我有一个简单的双向加密方法,可以生成加密字符串。方法如下:- public function cryption($string, $action = 'e') { $secret_key = 'secret-key'; $secret_iv = 'secret_iv'; $output = false; $encrypt_method = "AES-256-CBC"; $key = hash( 'sha2

我有一个简单的双向加密方法,可以生成加密字符串。方法如下:-

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控制器方法。使用斜杠意味着斜杠后面的字符串部分将被视为一个单独的参数。

我不是密码专家,因此我无法判断是否有加密或哈希方法在其加密/哈希输出中只生成字母数字字符

但是,我相信我可以帮助您解决潜在的问题。这是一个典型的情况下,逃跑得心应手。在下面,我将提供一个过于简化的示例来展示这个概念

因此,让我们假设
+
字符是唯一的禁止字符,并且您的加密函数已输出字符串
ab+cyk
;这将是代码中
$output
的值

现在让我们定义以下字符序列替换:

+ <-> ya
现在,当控制器在接收到的字符串中遇到字符序列时,
ya
,将是明确的。这意味着
+
,因为原始序列
ya
将被转义(编码)为
yya

回到我们过于简化的示例,字符串
ab+cyk
将在发送方变为
abyacyk
,并且可以由接收方(控制器)明确解码

这一原则(有变化)已经应用于软件开发中的无数标准和情况中。我马上想到的最著名的是C(其中反斜杠在字符串常量中有特殊含义,因此反斜杠是转义字符)和URI的转义(其中百分号是转义字符)

当然,在我们的示例中,
y
字符是转义字符。请注意,如果我们想要逐字逐句地使用转义字符,我们不会被要求加倍转义字符;这只是一个随机(尽管频繁)的选择。在我们的示例中,我们可以通过
yz
或其他方法来转义
y
,而不是
yy

鉴于您的声誉,我相信您能够在几分钟内编写适当的编码和解码函数,并且您可以轻松地扩展示例以转义其他不需要的字符(例如,转义
/
yb
)。如果您需要帮助,请留下评论,我会在我的答案中添加适当的伪代码

但最终,已经有了一个解决方案:如果您可以接受发送方发送给接收方(控制器)的字符串中的百分号(
%
),那么只需使用URI转义即可

这里的关键点是,我所知道的每种(脚本)语言都有模块甚至核心函数,它们可以可靠、舒适和(最后但并非最不重要的)高效地执行URI转义和取消转义(也称为URI编码和解码)。在大多数情况下,您甚至可以告诉这些模块/函数哪些字符需要转义,哪些字符不需要转义,以防您想要偏离通常的字符集

此解决方案的唯一缺点是可能会增加有效负载的大小,并且在实际编码有效负载之前无法预测大小

例如,如果我们按照上述方式进行编码和解码,如果字符串只包含
+
y
字符,则编码时字符串的大小将加倍。如果我们应用URI编码,字符串大小甚至可以增加三倍(因为要转义的字符将被替换为百分号加上字符的十六进制代码,即
a
将被替换为
%41
,例如(如果
a
将在要替换的字符集中))


考虑到今天的带宽、存储和RAM速度以及CPU能力,我认为这不会成为您的实际问题。

我不知道codeigniter,但您最终能否转义字符串,就像URL转义是如何完成的一样?您的输出是base-64编码的,这意味着它可以包含+、/、和=字符。如果使用URL安全版本的base-64,则+和/将替换为-和u。这样行吗?你可以将输出重新编码为十六进制形式,生成0-9a-f字符。你解决了问题吗?你能在这里发布你的方法吗?所以这对其他人很有用,谢谢
y <-> yy