简单的双向加密以生成没有特殊字符的加密密钥

时间:2018-09-02 10:10:05

标签: 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( '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控制器方法。带有斜线意味着在斜线之后的字符串部分将被视为一个单独的参数。

1 个答案:

答案 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能力,我认为这对您来说不是真正的问题。