分类 Web开发 下的文章

浏览器端实现MD5加密

目前,绝大多数网站,用户登录所提交的密码,是以明文方式在网络上传输。我认为加密后传输会更安全一些。那么,如何在浏览器端把用户输入的明文密码加密呢。

用客户端脚本语言 Javascript (简称JS)可实现浏览器端加密,现在几乎所有的浏览器都支持JS。

我这里使用英国的IT安全顾问 Paul Johnston(下文简称PAJ)撰写的MD5加密算法,算法原文请参考 md5.js

MD5是一种不可逆的加密算法,这种算法是公开的。但即使你截获到密文(加密后的字符),也非常非常难计算出原文。

使用也非常简单,在页面中引入上述JS加密文件,调用即可。

<script src="md5.js"></script>
<script>
    //这是md5加密函数,也可以使用sha1加密函数
    md5_out = hex_md5('the original string');
</script>

当然,还有SHA-1等其它算法,请参考PAJ的个人网站

附:MD5加密算法及sha1加密算法JS文件下载

Codeigniter 框架集成 Smarty 模板

1.复制 Smarty 库文件夹到 Codeigniter 合适位置

将 Smarty 的库文件夹 Smarty/libs/ 复制到 Codeigniter 根目录,并重命名为 smarty。

目录结构截图

2.在 Codeigniter 中创建一个库文件

在 Codeigniter 应用目录下库文件夹 codeigniter/application/libraries/ 中新建一个文件,命名为 Mysmarty.php 代码如下:

require dirname(APPPATH) . '/smarty/Smarty.class.php';

class Mysmarty extends Smarty
{
    public function __construct()
    {
        parent::__construct();

        $this->setTemplateDir(APPPATH . 'views');
        $this->setCompileDir(APPPATH . 'cache');
    }
}

3.设置自动加载该库文件

修改自动加载文件 codeigniter/application/config/autoload.php
增加一项:

$autoload['libraries'] = array('mysmarty');

至此,集成完毕。

4.如何调用

在控制器文件中可以通过 $this->mysmarty 类来调用 Smarty 的方法了,如:

$this->mysmarty->assign('name', 'Eric Ling');
$this->mysmarty->display('sample.tpl');

附:上述操作所使用的程序版本:

CodeIgniter 2.1.3
Smarty 3.1.12

CSDN网站600万用户密码泄露反映的问题

事件回顾

21日上午,网上开始有人议论说某网站数据库遭泄露。中午以后,陆续有人称已经下载到那份数据,有人证实其账户密码邮箱均准确无误地在那份数据中找到。同时网上多处提供此份数据的下载,下载地址也在一些专业论坛和QQ群被疯狂传播。

当晚20点41分,CSDN网站证实其部分用户数据泄露并致歉,称已向警方报案。

23日,CSDN发布更详细的账号处理办法,锁定存在安全隐患的账号,请用户找回并修改密码。

此次用户信息泄露事件在业内影响很大,本人当天下午在同事下载的那份数据中,试着查找自己的用户名,果然发现自己的用户名、密码、邮箱均准确。当时很震惊,这份200多兆的数据表明,超过600万用户信息被公开。于是,我立马通知朋友、同事,去各大网站改密码。

下面本人简单谈一下此次事件暴露出来的问题

0×01 加密

让人哭笑不得的是,这份数据中的密码竟然是明文存储的,没有经过任何处理。任何下载到这份数据的人,都可以直接看到账号和密码。我认为,这是非常不符合安全规范的做法。这样做,即使你的数据库在你们公司存储得非常妥当,绝对不可能泄露;那如果是公司内部员工,尤其是接触密码等敏感信息数据的技术人员,是不是可以容易看到密码。你能保证他不外漏吗!所以说,对密码这种敏感信息至少要进行加密处理,让任何人都无法直接看到密码原文。

0×02 传播

平常我们听到某某系统数据泄露,都很难得到被泄露的数据,只知道在黑客那里。这次不一样,在听问数据泄露的同时,已经可以轻易地下载到这份数据,几乎是人手一份。当时,我在微博上看到业界一人士谴责CSDN事后处理不当,说CSDN不应该光道歉,应该去截堵下载源,让数据的传播降到最低。据了解,当时金山某员工在微博上分享了一个下载源,事后他承认自己做了件错事。据说,迅雷全面屏蔽CSDN泄露数据,这是好事。

0×03 教训

这次密码泄露的600余万用户,绝大多数都是技术人员。各种IT系统,也是出自他们之手。这次,他们的账号和密码也暴露无遗,简直是个笑话。有网友发微博称,“这次CSDN账号密码泄露事件,算是给广大程序员上一堂生动的课吧。自己尝尝密码被泄露的苦果,以后做网站,得好好做账号系统,好好做安全。”

0×04 OpenID

这次密码泄露事件影响之大的另一个原因是,大多数人在多家网站采用同一个账号和密码。这样记忆方便,但问题也很突出,一家网站数据泄露,就都泄露了。据说,当时有些人拿那份数据的密码去套支付宝的密码。倘若你得支付宝密码也与CSDN的密码一致,那别人就可以登录你得支付宝;如果你的支付密码和登录密码刚好一样,且账户有余额,那就杯具了。

网上也有提供密码管理的工具,就是为了解决要记很多账号密码的烦恼。不过,我还是认为OpenID是更好的解决办法。维基百科对OpenID的解释是,OpenID 是一个去中心化的网上身份认证系统。对于支持OpenID的网站,用户不需要记住像用户名和密码这样的传统验证标记。取而代之的是,他们只需要预先在一个作为OpenID身份提供者(identity provider, IdP)的网站上注册。登录一个支持OpenID的网站非常简单,该网站会引导用户到OpenID服务网站去验证身份,验证成功后会回到要登录的网站且已经登录成功。这样,我们只需要记住一个账号、密码就可以全网通行了,当然这个前提条件是,其他网站都支持你使用的OpenID。

Update 20140427: 对于网站,浏览器端也可以将用户输入的密码加密,然后提交,确保传输的不是明文密码,参见《浏览器端实现MD5加密》。