利用MySQL加密函数保护Web网站敏感数据的方法分享

如果您正在运行使用MySQL的Web应用程序,那么它把密码或者其他敏感信息保存在应用程序里的机会就很大。保护这些数据免受黑客或者窥探者的获取是一个令人关注的重要问题,因为您既不能让未经授权的人员使用或者破坏应用程序,同时还要保证您的竞争优势。幸运的是,MySQL带有很多设计用来提供这种类型安全的加密函数。本文概述了其中的一些函数,并说明了如何使用它们,以及它们能够提供的不同级别的安全。

  双向加密

  就让我们从最简单的加密开始:双向加密。在这里,一段数据通过一个密钥被加密,只能够由知道这个密钥的人来解密。MySQL有两个函数来支持这种类型的加密,分别叫做ENCODE()和DECODE()。下面是一个简单的实例:

  mysql> INSERT INTO users (username, password) VALUES ('joe', ENCODE('guessme', 'abracadabra'));

  Query OK, 1 row affected (0.14 sec)

  其中,Joe的密码是guessme,它通过密钥abracadabra被加密。要注意的是,加密完的结果是一个二进制字符串,如下所示:

  mysql> SELECT * FROM users WHERE username='joe';

  +----------+----------+

  | username | password |

  +----------+----------+

  | joe | ?i??!? |

  +----------+----------+

  1 row in set (0.02 sec)

  abracadabra这个密钥对于恢复到原始的字符串至关重要。这个密钥必须被传递给DECODE()函数,以获得原始的、未加密的密码。下面就是它的使用方法:

  mysql> SELECT DECODE(password, 'abracadabra') FROM users WHERE username='joe';

  +---------------------------------+

  | DECODE(password, 'abracadabra') |

  +---------------------------------+

  | guessme |

  +---------------------------------+

  1 row in set (0.00 sec)

  应该很容易就看到它在Web应用程序里是如何运行的——在验证用户登录的时候,DECODE()会用网站专用的密钥解开保存在数据库里的密码,并和用户输入的内容进行对比。假设您把PHP用作自己的脚本语言,那么可以像下面这样进行查询:

  $query = "SELECT COUNT(*) FROM users WHERE username='$inputUser' AND DECODE(password, 'abracadabra') = '$inputPass'";?>

  提示:虽然ENCODE()和DECODE()这两个函数能够满足大多数的要求,但是有的时候您希望使用强度更高的加密手段。在这种情况下,您可以使用AES_ENCRYPT()和AES_DECRYPT()函数,它们的工作方式是相同的,但是加密强度更高。

  单向加密

  单向加密与双向加密不同,一旦数据被加密就没有办法颠倒这一过程。因此密码的验证包括对用户输入内容的重新加密,并将它与保存的密文进行比对,看是否匹配。一种简单的单向加密方式是MD5校验码。MySQL的MD5()函数会为您的数据创建一个“指纹”并将它保存起来,供验证测试使用。下面就是如何使用它的一个简单例子:

  mysql> INSERT INTO users (username, password) VALUES ('joe', MD5('guessme'));

  Query OK, 1 row affected (0.00 sec)

  mysql> SELECT * FROM users WHERE username='joe';

  +----------+----------------------------------+

  | username | password |

  +----------+----------------------------------+

  | joe | 81a58e89df1f34c5487568e17327a219 |

  +----------+----------------------------------+

  1 row in set (0.02 sec)

  现在您可以测试用户输入的内容是否与已经保存的密码匹配,方法是取得用户输入密码的MD5校验码,并将它与已经保存的密码进行比对,就像下面这样:

  mysql> SELECT COUNT(*) FROM users WHERE username='joe' AND password=MD5('guessme');

  +----------+

  | COUNT(*) |

  +----------+

  | 1 |

  +----------+

  1 row in set (0.00 sec)

  或者,您考虑一下使用ENCRYPT()函数,它使用系统底层的crypt()系统调用来完成加密。这个函数有两个参数:一个是要被加密的字符串,另一个是双(或者多)字符的“salt”。它然后会用salt加密字符串;这个salt然后可以被用来再次加密用户输入的内容,并将它与先前加密的字符串进行比对。下面一个例子说明了如何使用它:

  mysql> INSERT INTO users (username, password) VALUES ('joe', ENCRYPT('guessme', 'ab'));

  Query OK, 1 row affected (0.00 sec)

  mysql> SELECT * FROM users WHERE username='joe';

  +----------+---------------+
 | username | password |

  +----------+---------------+

  | joe | ab/G8gtZdMwak |

  +----------+---------------+

  1 row in set (0.00 sec)

  结果是

  mysql> SELECT COUNT(*) FROM users WHERE username='joe' AND password=ENCRYPT('guessme', 'ab');

  +----------+

  | COUNT(*) |

  +----------+

  | 1 |

  +----------+

  1 row in set (0.00 sec)

  提示:ENCRYPT()只能用在*NIX系统上,因为它需要用到底层的crypt()库。

(0)

相关推荐

  • 探究在C++程序并发时保护共享数据的问题

    我们先通过一个简单的代码来了解该问题. 同步问题 我们使用一个简单的结构体 Counter,该结构体包含一个值以及一个方法用来改变这个值: struct Counter { int value; void increment(){ ++value; } }; 然后启动多个线程来修改结构体的值: int main(){ Counter counter; std::vector<std::thread> threads; for(int i = 0; i < 5; ++i){ threads

  • 在ASP.NET 2.0中操作数据之七十一:保护连接字符串及其它设置信息

    导言: ASP.NET应用程序的设置信息通常都存储在一个名为Web.config的XML文件里.在教程的前面部分我们已经好几次修改过Web.config文件了.比如在第一章,我们创建名为Northwind的数据集时,数据库连接字符串信息自动的添加到Web.config文件的<connectionStrings>节点.再后来,在第3章里,我们手动更新了Web.config文件,添加了一个<pages>元素,对所有的ASP.NET页面运用DataWebControls主题. 由于Web

  • 如何保护MySQL中重要数据的方法

    企业最有价值的资产通常是其数据库中的客户或产品信息.因此,在这些企业中,数据库管理的一个重要部分就是保护这些数据免受外部攻击,及修复软/硬件故障. 在大多数情况下,软硬件故障通过数据备份机制来处理.多数数据库都自带有内置的工具自动完成整个过程,所以这方面的工作相对轻松,也不会出错.但麻烦却来自另一面:阻止外来黑客入侵窃取或破坏数据库中的信息.不幸的是,一般没有自动工具解决这一问题;而且,这需要管理员手工设置障碍来阻止黑客,确保公司数据的安全. 不对数据库进行保护的常见原因是由于这一工作"麻烦&q

  • Oracle数据库 DGbroker三种保护模式的切换

    1.三种保护模式 – Maximum protection 在Maximum protection下, 可以保证从库和主库数据完全一样,做到zero data loss.事务同时在主从两边提交完成,才算事务完成.如果从库宕机或者网络出现问题,主从库不能通讯,主库也立即宕机.在这种方式下,具有最高的保护等级.但是这种模式对主库性能影响很大,要求高速的网络连接. – Maximum availability 在Maximum availability模式下,如果和从库的连接正常,运行方式等同Maxi

  • 保护你的Sqlite数据库(SQLite数据库安全秘籍)

    SQLite无任何限制的授权协议以及支持大部分标准的SQL 92语句,相信会有越来越多的人使用这个数据库. PHP与SQLite的结合就如同当年的ASP与ACCESS结合一样,ACCESS可以遭遇被人恶意下载,SQLite同样不能幸免,因为SQLite也是一个二进制文件,只要WEB能访问到的,就能被下载. ACCESS可以采用一些诡计来防止用户下载,SQLite也可以.下面向大家介绍几种常用的防止SQLite被下载的方法 1.将SQLite放在WEB不能访问到的地方. 有些虚拟主机一般也都会提供

  • 设置密码保护的SqlServer数据库备份文件与恢复文件的方法

    设置密码保护SqlServer数据库备份文件! 备份SqlServer数据库 Backup Database [数据库] To disk='c:\mysql'+ replace(replace(replace(replace(CONVERT(varchar, getdate(), 121),'-',''),' ',''),':',''),'.','') +'.bak' With Password = '123',init; 恢复SqlServer数据库 Restore Database [数据库

  • 利用DOS命令来对抗U盘病毒保护U盘数据

    U盘的便捷性与大容量的存储性,深受着广大用户的欢迎,几乎每个用户都会人手一个,但就是这么广泛的使用,以至于U盘被病毒悄悄盯上,越来越多的病毒通过电脑.通过文件毁坏重要的数据,为了保护好U盘的数据,灭除U盘病毒成为了用户们的首要任务,下面就教大家一个小技巧,利用DOS命令来对抗U盘病毒. 利用DOS命令删除U盘病毒的步骤: 1.点击"开始→运行",输入"CMD",按回车键 2.打开命令提示符窗口,切换到U盘所在盘符或是中了Autorun.inf病毒的盘符下,依次执行下

  • C++多线程编程时的数据保护

    在编写多线程程序时,多个线程同时访问某个共享资源,会导致同步的问题,这篇文章中我们将介绍 C++11 多线程编程中的数据保护. 数据丢失 让我们从一个简单的例子开始,请看如下代码: #include <iostream> #include <string> #include <thread> #include <vector> using std::thread; using std::vector; using std::cout; using std::

  • ASP.NET Core 数据保护(Data Protection)上篇

    前言  上一篇记录了如何在 Kestrel 中使用 HTTPS(SSL), 也是我们目前项目中实际使用到的. 数据安全往往是开发人员很容易忽略的一个部分,包括我自己.近两年业内也出现了很多因为安全问题导致了很多严重事情发生,所以安全对我们开发人员很重要,我们要对我们的代码的安全负责. 在工作中,我们常常会见到 encode,base64,sha256, rsa, hash,encryption, md5 等,一些人对他们还傻傻分不清楚,也不知道什么时候使用他们,还有一些人认为MD5就是加密算法.

  • ASP.NET Core 数据保护(Data Protection 集群场景)下篇

    前言  接[中篇] ,在有一些场景下,我们需要对 ASP.NET Core 的加密方法进行扩展,来适应我们的需求,这个时候就需要使用到了一些 Core 提供的高级的功能. 本文还列举了在集群场景下,有时候我们需要实现自己的一些方法来对Data Protection进行分布式配置. 加密扩展  IAuthenticatedEncryptor 和 IAuthenticatedEncryptorDescriptor  IAuthenticatedEncryptor是 Data Protection 在

随机推荐