加密PHP字符串并在页面重新加载后解密

时间:2015-02-22 08:50:15

标签: php encryption

我正在创建一个注册页面,当您尝试注册时,它会生成一个随机的六位数字。然后,该号码将通过电子邮件发送给您,然后您可以在浏览器中输入该号码以“验证”。

虽然我在加密字符串然后在页面重新加载后对其进行解密时遇到了问题,但是我通过一个不仅实际上不起作用的表单传递了密钥和iv_size,我还认为它很不安全因为IV应该保密。

所以这就是问题,我如何加密PHP中的字符串并在页面重新加载后解密它,本质上是一个新页面,因为没有变量。

给你我当前的代码是有点傻,因为它不起作用,但在这里,你认为你可以解决它;

$randInt = mt_rand(0, 9);
            for($i=1; $i<=6; $i++){
                $randInt .= mt_rand(0, 9);
            }
            $key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
            $key_size =  strlen($key);
            $plaintext = $randInt;
            $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
            $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
            $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_CBC, $iv);
            $ciphertext = $iv . $ciphertext;
            $ciphertext_base64 = base64_encode($ciphertext);

            ?>
            <script>
                notify('Please Enter The Verification Number We Sent You Below', "#C60");
            </script>
            <?
            echo('We sent a verification code to the email provided, please enter it below to continue with your sign up process.');

            ?>
            <form method="post">
                <input type="hidden" name="encryptedKey" value="<?php echo($ciphertext_base64);?>">
                <input type="hidden" name="ivSize" value="<?php echo($iv_size);?>">
                <input type="hidden" name="key" value="<?php echo($key);?>">
                <input type="number" name="verify" id="verify">
            </form>

这是应该解密它的部分:

$iv_size = $_POST['ivSize'];
            $key = $_POST['key'];
            $ciphertext_dec = base64_decode($_POST['encryptedKey']);
            $iv_dec = substr($ciphertext_dec, 0, $iv_size);
            $ciphertext_dec = substr($ciphertext_dec, $iv_size);
            $plaintext_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
            echo  $plaintext_dec . "\n";

即使这可以修复,它仍然太不安全了。我得到的错误告诉我关键太久了,如果我将两个代码块放在一起,它可以工作,但是当我将它们分开时,它们就不起作用了。我觉得这个形式在传递时搞乱了变量。

2 个答案:

答案 0 :(得分:1)

如果您正在编码和解码整数,我建议您查看Hashids Lib http://hashids.org/php/

$hashids = new Hashids\Hashids();
$id = $hashids->encode(1, 2, 3);
// Output $id => laHquq

您可以使用数字数组或单个数字,并限制编码级别的字符。

阅读您将理解的Hashids文档

答案 1 :(得分:0)

这个答案是针对他在我之前的答案中在评论区域提出的问题。 [不是对原始问题的回答]

Html文件

<form method="POST" action="#" id="validation-form">
<input id="validation-key" name="validation-key">
</form>

 <script>
      $('#validation-form').submit(function(){
            var data = $('#validation-form').serialize();
            $.ajax({
                url:"validation_key.php",
                type:"POST",
                data:data,
                success:function(result){
                    // do what when the form validation is success
                    alert(result);

                },
                error:function( jqXHR, textStatus, errorThrown){
                    alert("Something went wrong");
                }
            })
      })
</script>

PHP验证文件

<?php
if (isset($_POST['validation-key'])) {
    // DO what you to validate the key is in here

    if($_POST['validation-key'] == "123456"){
        echo "Valid key";
    }else{
        echo "Invalid key";
    }


}else{
    echo "Validation key is missing";
}

不要忘记添加jquery lib http://code.jquery.com/jquery-migrate-1.2.1.min.js