【问题标题】:Can i Encrypt submitted form data in PHP by using SSL?我可以使用 SSL 加密 PHP 中提交的表单数据吗?
【发布时间】:2011-06-05 22:06:08
【问题描述】:

如果我为我的网站购买 SSL 证书,我可以在 PHP 中手动加密提交的表单数据,然后将其存储到数据库吗?

请解释一下 ssl 的作用?

例子:

网站的访问者输入用户名和密码,我可以使用 SSL 加密两个数据在 php 中吗?

像这样。

$u_name = verisign_ssl_encryption($_POST['username']);
$pass = verisign_ssl_encryption($_POST['password']);

mysql_query('insert into table (username,password) values ("'.$u_name.'", "'.$pass.'")';

我可以像这样使用相同的 SSL 从表中解密检索到的加密数据吗

$row = mysql_fetch_array(mysql_query('select * from table where u_id = 1'));
$user_card_no = verisign_ssl_decrypt($row['card_no']);
echo $user_card_no;

还是 SSL 与此不同?

提前感谢您的回答!

【问题讨论】:

  • “请解释一下 ssl 的作用?” Google 和 Wikipedia 是否都因今天的重大灾难而崩溃?
  • 防止SQL注入和散列密码MUCH更为重要。
  • 请注意,有两个非常不同的事情:通过签名的 SSL 证书加密流量和加密您存储的数据。第一个需要(如果您不想要浏览器警告)某种受信任的权威来签署您的证书(大多数收费),并作为 Web 服务器的一部分安装。这对于保护网络流量很重要。第二个对于保护您存储的私人数据很重要,尽管它不像您预期​​的那样安全(考虑到私钥也可能被盗)。

标签: php ssl encryption


【解决方案1】:

是的,您可以这样做,但您无需购买证书即可使用 SSL 加密。任何自签名证书都可以加密您服务器上的数据。

请注意,如果黑客获得了您的代码的访问权限,他们很可能可以访问您的私钥,并且他们仍然能够访问您的数据库。

此外,即使您加密了数据,您也应该对密码进行哈希处理(使用盐)。

openssl_encrypt()及相关功能。

【讨论】:

    【解决方案2】:

    SSL 代表 Secure Sockets Layer,基本上为 Web 浏览器和 Web 服务器提供了一个安全通道来交换信息。基本上,使用 SSL 通过 Internet 发送的任何内容都是安全的,但 SSL 与您的服务器收到用户名或密码后的加密没有任何关系。

    基本上,如果你想确保服务器和浏览器之间的连接是安全的,你首先测试是否使用了 SSL (https),​​如果没有,则重定向到同一页面,但以“https:/”开头/" 而不是标准的 "http://"

     if($_SERVER['HTTPS'] != 'on') {
         header('HTTP/1.1 301 Moved Permanently');
         header('Location: "https://" ' . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"]);
         exit();
     }
    

    将此代码放在页面顶部,它将重定向用户的浏览器以使用安全连接。使用“exit()”将确保您的脚本不会向浏览器发送任何内容,除非 ($_SERVER['HTTPS'] == 'on')。

    如果您想在服务器收到用户名/密码后保护它们的安全,比如添加到数据库中,您应该使用加盐哈希。基本上,加盐哈希将计算一个无法反转以确定原始密码的哈希码。这样,如果有人入侵您的数据库,他们将无法窃取任何密码。

    加盐哈希中的“盐”只是一个随机词或序列,这使得字典攻击变得更加困难。一个简单的函数,它将返回一个字符串的加盐哈希:

    function getSaltedHash($string){
        $salted = "SaLtStRiNg" . $string;
        $hash   = md5($salted);
        return $hash;
    }
    

    这个函数的输出会是一个很长的十六进制字符串(比如:23fds327de345ad7839d9799a9b),你应​​该把这个数字作为密码存储在数据库中,当你需要验证密码时,只需计算一个密码的哈希码用户已发送(通过使用相同的哈希函数)您存储在数据库中的哈希码。

    如果您需要真正加密数据以放入数据库(散列与加密不同),那么您需要查看一些 PHP 的加密包,或者如果威瑞信为您提供了加密/解密 API,然后使用它。

    在任何情况下,您都不应尝试设计自己的加密方案,并且绝对不要使用混淆(如 BASE64 或 ROT13),这些对保护您的数据没有任何作用,任何有能力的黑客都能够非常轻松地解码混淆数据.

    【讨论】:

    • 很好的提示,但是 md5 并不是最好的哈希函数。此外,附加用户名会使不同用户中相同密码的哈希看起来不同。
    • @NickSoft 单独使用用户名作为盐不是一个好主意。您可以将用户名/电子邮件与盐混合并在其上应用哈希函数。 $salted = "SaLtStRiNg" . $string ."username/email" ; $hash = md5($salted);
    • @Rao 好吧,如果他们获得密码,他们很有可能获得算法,因此向哈希添加更多内容几乎没有提高安全性(但仍然是一件好事做)。我没有提到它,因为如果我提到它,我将不得不写一篇完整的文章。就像应用哈希函数 1000 到 100,000 次以增加破解时间,将每个用户的授权限制为每 1-2 秒一次,将每个 ip 的错误身份验证次数限制为每小时 10 次......
    【解决方案3】:

    SSL 可以以多种方式使用,但我认为您的意思是您的网站需要 ssl 支持。使用 apache,您可以使用 modssl http://www.modssl.org/ 来做到这一点。

    您应该咨询您的托管服务提供商,以便为您的网站配置 ssl 支持。

    【讨论】:

      【解决方案4】:

      如果您不想购买 SSL 证书,请使用 base64 加密您提交的数据。

      【讨论】:

      • Base64 是 encoding,不能替代 SSL 加密
      猜你喜欢
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 2013-09-01
      • 2019-12-30
      • 2012-08-30
      相关资源
      最近更新 更多