向普通人加密 用PHP程序保护数据

2008-02-23 06:28:31来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

在这个日渐虚拟的互联网世界中,您必须小心保护自已的数据。本文将介绍编码和加密一些重要信息(比如密码、信用卡号、甚至整个消息)的基础知识。并通过使用 PHP 的内置功能,了解加密和解密信息的意义,并且将了解一些涉及密码和其他数据的实际示例。
了解当今现实世界与 20 年前的现实世界的不同。在 20 世纪 80 年代,加密是一种特工人员的行为 —— 是您在 Tom Clancy 的侦探小说中才可以读到的情节。如果某人想保持少量私有信息,那么他必须使用密码、密码短语或其他基本方法对数据进行加密。

而现在,加密遍布各个领域。密码也被加密保存在数据库中。电脑空间中的加密的通道可能是通过 SSL、SSH 和其他技术加密的 —— 更不必说拟虚专用网络。人们平常可以而且一定能够使用 Pretty Good Privacy (PGP) 来保护敏感的文件和电子邮件。

作为一名 PHP 开发人员,您应该知道,强有力的安全做法并不是只将安全保护用于独特的应用程序 —— 还可以将其用于您当前从事的项目。用户要树立从一般加密方法(例如,在登录页上的密码字段中不显示明文)过渡到各种高级加密方法(如 DES、MD5、SHA1 和 Blowfish)的意识。

因时间和篇幅所限,这里无法讨论加密的各个方面,但是您将从这里了解涵盖适用于您的多数情况的基本内容。我们通过使用 PHP 内置功能先了解加密和解密信息的意义,进而了解涉及密码和其他数据的一些实际示例。在本文中,加密是在更大的安全上下文中进行讨论的。最后,将介绍其他 PHP 扩展和插件。

加密技术的初级读本

作为希腊的词根资产,加密技术是一种 “神秘编写” 艺术。凯撒密码 是最古老的一种密码,形式也最为简单。它采用明文消息,将字母移动 n 个位置,从而产生暗文。例如:

明文:Veni Vidi Vici
暗文:Xgpk Xkfk Xkek
通过检查暗文并借助一些启发式的技巧,您可以知道,明文实际上是移动了两个字符。凯撒密码很容易破解。例如:检查上述信息,可知 X 重复了多次,且 k 也是如此。这就变成猜迷,确定多少个四字母的词有那样多的元音。知道了这些带元音的词后,您就知道了移动其余字的方法。它还可以帮助您判断明文是否为拉丁文,让您对其有大致的了解。

现代加密技术的功能非常强大,使用了超越统一移动字母和符号的算法。本文不打算详细介绍这些算法,仅介绍一些 PHP 安装,它包括您需要适度(或特别)保持数据安全的所有内容。

不存在 100% 不受攻击的绝对完整的加密方法。大概每隔一个月,一些黑客及其朋友就会集合 1,000 台计算机,在最初的几天里强力进行计算破坏,从而使最新的加密方法崩溃。不过,您可以密封您的系统和数据,不让黑客干扰和非法闯入。他们将在其他地方寻找可乘之机。

了解这些内容之后,让我们转而了解那些受简单登录形式保护的示例 PHP 应用程序。

没有安全保障或加密的 PHP 形式处理

假定您是一位新的 Web 应用程序开发人员,没有更多的机会使用安全功能。您创建了您的第一个应用程序,它可以在专用用户表中存储用户名和密码,但是,您没有对这些密码进行加密。这些密码以一眼就看明白的形式存在,任何人都可以使用它们访问数据库。您可以构建一个如下所示的登录页面。

清单 1. 简单的登录页面

<form action="verify.php" method="post">
<p><label for='username'>Username</label>
<input type='text' name='username' id='username'/>
</p>
<p><label for='password'>Password</label>
<input type='text' name='password' id='password'/>
</p>
<p><input type="submit" name="submit" value="log in"/>
</p>
</form>

此 HTML 标记存在什么问题?为密码字段选择的输入类型为 text,这意味着用户键入该字段的任何内容都会以明文形式显示在屏幕上。

您可以方便地将该类型更改为 password,并将该字段中的用户输入替换为一串星号。可靠吗?绝对可靠。不过,这一步骤在很多应用程序中会被忽略。事情虽小,但在安全方面会使人们感到不安。您愿意将钱存入休息大厅的窗口被严重毁坏的银行吗?也许您会。但是您可能更期望银行是完好无损的。对于应用程序来说,道理相同。

让我们继续介绍处理表单提交的 verify.php 文件。

清单 2. 简单的 PHP 登录验证

<?php
$user = $_POST['user'];
$pw = $_POST['password'];

$sql = "select user,password from users
where user='$user'
and password='$pw'
limit 1';
$result = mysql_query($sql);

if (mysql_num_rows($result)){
//we have a match!
}else{
//no match
}

?>

读阅到此,您会露出满意的微笑。等待阅读本文加密部分的部分读者可能变得不耐烦了,但是加密仅为安全问题的一部分。您还必须聪明地处理引入的用户数据。developerWorks 教程 “锁定您的 PHP 应用程序”(请参阅参考资料)讨论了 SQL 注射:将不正常的数据发送到数据库可导致有害或无根据的访问。无论您使用多少个加密,公开弱点没有一点好处。

您应遵循下面的传统安全原则:“不信任用户提供的数据” 和 “深层防御”;清除传入数据并通过转义传入的字符串保护数据库(参见清单 3)。深层防御是将多余的安全方法都妥善保管 —— 不仅包括加密,还包括用户所提供数据的智能处理。
清单 3. 保护 PHP 形式解析免受用户数据操作的影响

<?php
$user = strip_tags(substr($_POST['user'],0,32));
$pw = strip_tags(substr($_POST['password'],0,32));

$sql = "select user,password from users
where user='". mysql_real_escape_string($user)."'
and password='". mysql_real_escape_string($pw)."'
limit 1';
$result = mysql_query($sql);

if (mysql_num_rows($result)){
//we have a match!
}else{
//no match
}
?>


通过合理使用 strip_tags()、substr() 和 mysql_real_escape_string(),可以删除任何潜在的有害命令,将字符串减少到 32 个字符,并去掉所有特殊字符,数据库可能将这些字符解释为非预期命令字符串的一部分。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:PHP对文本数据库的基本操作方法

下一篇:用新PHP插件实现MySQL为基础的事务