生成可直接在URL中使用的加密字符串

时间:2017-02-16 10:42:57

标签: php encryption

有时在我的表单中,我发现自己使用隐藏的输入,其中包含一些客户端无需知道的值。 (实际上,即使他知道这不是一个大问题,但我不喜欢......而且我不需要一个非常安全和复杂的加密东西)

根据这里的一些答案(especially this),我构建了下一个类

class Crypto
{

    const ENCRYPT_METHODE = "AES-256-CBC";
    const SECRET_HASH     = "25c6c7ff35b9979b151f2136cd13b0ff";

    private static function GetIV()
    {

        if (empty($_SESSION['crypto']['iv'])) {
            $iv_size                  = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
            $_SESSION['crypto']['iv'] = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        }
        return $_SESSION['crypto']['iv'];
    }

    public static function Encrypt($value)
    {
        return openssl_encrypt($value,
            self::ENCRYPT_METHODE,
            self::SECRET_HASH,
            0,
            self::GetIV());
    }

    public static function Decrypt($value)
    {
        return openssl_decrypt($value,
            self::ENCRYPT_METHODE,
            self::SECRET_HASH,
            0,
            self::GetIV());
    }
}

...直到现在Crypto使用隐藏输入才能正常工作,但有时会生成需要编码的字符串,然后再将其放入网址中

那么,如何改进这个班级来做我需要的呢? 或者是否有其他更好的方法来加密< =>解密字符串?


修改
它不是试图生成有效的URL字符串值(直接使用openssl_decrypt),而是将urlencode / urldecode添加到方法中可以正常工作,这就是加密的方式方法将如下所示:

class Crypto{

     // ...

    public static function Encrypt($value){
        $encrypted = openssl_encrypt($value,
                               self::ENCRYPT_METHODE,
                               self::SECRET_HASH,
                               0,
                               self::GetIV());

        return urlencode($encrypted);
    }

    public static function Decrypt($value){
        $value = urldecode($value);
        return openssl_decrypt($value,
                               self::ENCRYPT_METHODE,
                               self::SECRET_HASH,
                               0,
                               self::GetIV());
    }
}

我认为它会随处可见,感谢this answer

1 个答案:

答案 0 :(得分:2)

您可以使用url_encode()确保每个字符都可以传递到网址,urldecode()可以恢复字符。