从新浪微博和MySQL的密码保护机制谈HTTPS/SSL的必要性

虽然业界已经达成共识,在传输用户密码等需要保密的信息时,尽可能采用HTTPS/SSL协议传输。但我们还是可以看到少数没有用HTTPS/SSL加密的网站或应用。新浪微博的登录页面和MySQL是两个例子。接下来我们详细分析它们的密码传输和保存机制。

新浪微博

新浪微博的登录页面的URL是http://www.weibo.com/login。从这可以看出新浪微博的登录页面没有采用HTTPS来传输用户的密码。

如果我们对登录相关的代码感兴趣,我们可以用浏览器的调试功能看到如下图所示的代码:

从这段代码我们可以猜出新浪微博的登录过程如下:

  1. 新浪微博的客户端往服务器端发送一个连接请求;
  2. 服务器端响应客户端的请求,返回的信息里包含当前时间(图中的servertime)和一个随机数(图中的nonce);
  3. 客户端对用户的密码进行加密,然后再发送给服务器端验证。加密的算法是SHA1(SHA1(SHA1(Password))+ salt),其中的salt是从服务器返回的时间和随机数。

我们看不到服务器端的代码,但大致可以猜出数据库里存的是明文密码的一次或者两次SHA1加密之后的哈希值。为了防止被彩虹表法破解,存两次SHA1加密的哈希值的可能性要高一些。

服务器端在验证密码的时候先从数据库里读出密码的哈希值。服务器端知道自己发给客户端的时间和随机数,于是它把密码的哈希值和时间以及随机数拼接起来再用SHA1算法计算新的哈希值。最后它比较计算出来的哈希值和从客户端接收到的用户密码加密后的哈希值。如果两个哈希值相同,则登录验证成功。

破解方法

新浪微博这种密码保护机制还是存在很大风险。一旦存储用户密码的数据库被黑客侵入,那么黑客很容易就能用他人的密码登录。

黑客侵入数据库之后,他就知道他人密码的两次SHA1算法的哈希值。接着他可以写一个假的客户端,然后通过假的客户端欺骗服务器端返回当前时间和一个随机数。接下来把服务器端返回的信息当作盐和数据库里读取的密码的哈希值拼接到一起再调用SHA1算法算出新的哈希值,最后把这个哈希值发送给服务器端。由于这样生成的哈希值符合新浪微博密码验证的协议,服务器端会认为密码有效。

因此黑客尽管没有破解他人的密码,但他却在侵入数据库之后用他人的密码登录。

MySQL

MySQL的密码保护机制和前面的新浪微博的机制有类似之处。在数据库表格mysql.user的Password列中,密码存的是用SHA1算法两次加密之后的哈希值。客户端和服务器端的通讯协议包含如下几个步骤:

  1. MySQL客户端(比如mysql.exe)发起连接请求;
  2. MySQL服务器端(mysqld.exe)返回一个随机字符串scramble;
  3. MySQL客户端接收到scramble后,进行如下计算并把token发给服务器端:
    1. stage1_hash = SHA1(password),其中password是用户输入的明文密码;
    2. token = SHA1(scramble +SHA1(stage1_hash)) XOR stage1_hash

服务器端在接收到加密之后的密码token之后,采取如下步骤验证密码是否有效:

  1. stage1_hash‘ = token XOR SHA1(scramble +mysql.user.Password);
  2. 计算SHA1(stage1_hash‘)的值,并和mysql.user.Password作比较。如果两者相同则密码有效。

如果对MySQL的源代码感兴趣,相应的代码在.\mysql-5.5.37\sql\password.c可以找到。

我们可以看出MySQL的密码在传输过程中客户端与服务器端的协议比新浪微博的要复杂。这样的好处是如果黑客入侵了mysql.user表拿到了两次SHA1加密的哈希值,他也没有办法伪装他人。这是因为在通讯协议的第3步在计算token的过程中,需要对密码作一次SHA1加密的哈希值。而在mysql.user表中,只有对密码作两次SHA1的哈希值。

破解方法

虽然MySQL的机制比新浪微博的要安全一些,但它仍然存在安全隐患。这个机制的短板在于密码的存储。存储密码的两次SHA1算法的哈希值并不能有效防止彩虹表法破解。很多黑客手上都有SHA1算法哈希值的彩虹表,他们只要把这样的彩虹表里的哈希值再作一次SHA1加密就可以了。

MySQL采用这个机制也可以理解。如果黑客能够侵入mysql.user表格,那么他自然也能侵入MySQL数据库中的其他表格。通常黑客破解的密码的目的是盗取他人的数据。也就是黑客一旦侵入了mysql.user表格,那么他无需破解密码也就能盗取数据了。

MySQL采用上述密码保护机制有它的理由。其他系统如果也采用同样的机制,就要仔细考虑其中的安全隐患了。

小结

一个系统的密码保护机制是否安全取决于两个方面,即密码传输的安全性和密码存储的安全性。新浪微博和MySQL都没有采用HTTPS/SSL传输密码。为了防止黑客在密码传输过程中窃听密码,它们只能在传输过程中加盐然后用SHA1算法加密。由于密码在传输过程中需要加盐,为了能够正常验证密码,因此在存储密码时只能存储没有加盐的SHA1算法的哈希值。因此密码的存储成为整个机制的短板。

笔者曾写过一篇博客讨论如何安全地存储密码。感兴趣的读者请参考http://blog.csdn.net/cadcisdhht/article/details/19282407

我们没有必要在抛弃HTTPS/SSL的前提下试图去设计更加复杂的加密算法或者通讯协议。上述提到的两个方案是新浪微博和MySQL的程序员们花了大量精力设计出来的机制,尚且还有明显的漏洞。我不觉得每个程序员都有自信说自己比新浪微博或者MySQL的程序员更加优秀。

如果安全性对一个系统是至关重要的因素,那么就采用HTTPS/SSL吧。虽然部署HTTPS/SSL的系统有些麻烦,申请可信赖的CA的证书还要花钱,但和安全漏洞的潜在风险相比这些代价还是值得的。

从新浪微博和MySQL的密码保护机制谈HTTPS/SSL的必要性,布布扣,bubuko.com

时间: 2024-10-01 18:30:18

从新浪微博和MySQL的密码保护机制谈HTTPS/SSL的必要性的相关文章

[转]浅谈https\ssl\数字证书

浅谈https\ssl\数字证书 http://www.cnblogs.com/P_Chou/archive/2010/12/27/https-ssl-certification.html 全球可信的SSL数字证书申请:http://www.shuzizhengshu.com 在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了.本文追本溯源围绕这个模式谈一谈. 名词解释 首先解释一下上面的几个名词: https:在http(超文本传输协议)基础上提出的

浅谈https\ssl\数字证书[转载]

在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了.本文追本溯源围绕这个模式谈一谈. 名词解释 首先解释一下上面的几个名词: https:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议.http协议直接放置在TCP协议之上,而https提出在http和TCP中间加上一层加密层.从发送端看,这一层负责把http的内容加密后送到下层的TCP,从接收方看,这一层负责将TCP送来的数据解密还原成http的内容.

浅谈https\ssl\数字证书

全球可信的SSL数字证书申请:http://www.shuzizhengshu.com 在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了.本文追本溯源围绕这个模式谈一谈. 名词解释 首先解释一下上面的几个名词: https:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议.http协议直接放置在TCP协议之上,而https提出在http和TCP中间加上一层加密层.从发送端看,这一层负责把http的内容加

说一说MySQL的锁机制

锁概述 MySQL的锁机制,就是数据库为了保证数据的一致性而设计的面对并发场景的一种规则. 最显著的特点是不同的存储引擎支持不同的锁机制,InnoDB支持行锁和表锁,MyISAM支持表锁. 表锁就是把整张表锁起来,特点是加锁快,开销小,不会出现死锁,锁粒度大,发生锁冲突的概率高,并发相对较低. 行锁就是以行为单位把数据锁起来,特点是加锁慢,开销大,会出现死锁,锁粒度小,发生锁冲突的概率低,并发度也相对表锁较高. MyISAM锁 MyISAM的锁调度 在MyISAM引擎中,读锁和写锁是互斥的,读写

新浪微博发送消息和授权机制原理(WeiboSDK)

1.首先是在微博发送消息,对于刚开始做weibo发送消息的初学者会有一个误区,那就是会认为需要授权后才可以发送消息,其实发送消息只需要几行代码就可以实现了,非常简单,不需要先授权再发送消息,因为weibosdk已经帮我们封装好了.(此情况需要用户安装客户端) 发送消息流程为:点击发送消息按键----SDK会自动帮我们判断用户是否安装了新浪微博客户端--如果未安装弹出安装提示----如果安装直接跳转到sina微博客户端进行发送----发送成功后自动跳回原应用程序. 1)在AppDelegate中注

第 7 章 MySQL 数据库锁定机制

7.1 MySQL 锁定机制简介 数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL 自然也不能例外.MySQL 数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应用场景特点都不太一样,为了满足各自特定应用场景的需求,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别. 总的来说,MySQL 各存储引擎使用了三

理解MySql事务隔离机制、锁以及各种锁协议

一直以来对数据库的事务隔离机制的理解总是停留在表面,其内容也是看一遍忘一边.这两天决定从原理上理解它,整理成自己的知识.查阅资料的过程中发现好多零碎的概念如果串起来足够写一本书,所以在这里给自己梳理一个脉络,具体的内容参考引文或在网上搜一下.由于平时接触最多的是MySQL,所以文章中某些部分是MySQL特有的特性,请读者注意. 数据库并发操作会引发的问题: 多个事务同时访问数据库时候,会发生下列5类问题,包括3类数据读问题(脏读,不可重复读,幻读),2类数据更新问题(第一类丢失更新,第二类丢失更

细聊MySQL的安全机制

MySQL作为系统的数据库,在安全性方面有非常高的要求.如果一个系统的数据库被非法进入或窃听,则系统的数据将受到非常严重的威胁,轻则数据.密码被盗,重则导致整个系统瘫痪.所以数据库的安全对于系统来说是非常重要的. 本文将从MySQL的服务器启动与客户端访问.操作及链路三方面来阐述MySQL的安全机制. 一.MySQL的服务器启动与客户端访问.        1.服务器启动,启动服务器在安全方面的影响主要是启动它的用户.默认情况下,MySQL不允许使用root账号启动.我们应该建立一个只能操作My

mysql insert锁机制【转】

最近再找一些MySQL锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理的不是很全,都是工作中碰到的,会持续更新 笔者能力有限,如果有不正确的,或者不到位的地方,还请大家指出来,方便你我,方便大家. 此测试环境 Mysql 5.5 基于innodb 引擎 [sql] view plain copy insert into  table1 values select  … from table2 …. 此种方法,会锁table2 [sql] view plain copy delete t