聊聊如何设计安全的web密码

在web开发中,用户账户系统安全性直接关呼用户隐私,通常我们为用户提供了一个登录页面来进入系统,用户只要提供正的账号和密码,就可以进入系统内部。所以密码的安全性是我们首先要考虑的。首先我们来看一下,密码面临的威胁:

众所周知目前破解密码的方式主要有:字典攻击与暴力攻击、查表法、反向查表法、彩虹表等。

字典攻击与暴力攻击同属暴力破解范筹,其特点是适合简单的、常规性密码的破解,破解速度慢,但无法避免,只要时间成本足够终会破解成功。

查表法对于算法相同的哈希值有着极快的效率,主要思想是预先按照某种哈希算法对字典中的密码进行计算,然后把哈希值与密码存储一个用于快速查询的数据结构中,然后通过查表时行破解。反向查表与彩虹表,原理大多与此类似。

本文主要以PHP语言为类,展开讲解。以前我们通常的做法是使用md5或md5+salt方式来加密密码,以保证密码的安全。

Demo:

<?php

$password = '123456';

$passcode = md5($password);//直接用MD5

//或

$passcode =md5($password.$salt);//MD5(密码明文+随机字符串);

//或

$passcode =md5(md5($password).$salt);//二次哈希

?>

但是PHP5.5引入了Password Hashing函数,内核 自带无需扩展。在PHP5.4下也是支持的。

Password Hashing主要提供了4个函数

//查看哈希值的相关信息

array password_get_info(string $hash)

//创建hash密码

string password_hash(string $password,integer $algo [,array $options])

//判断hash密码是否特定选项、算法所创建

boolean password_needs_rehash(string $hash,integer  $algo [,array $options])

//验证密码是否正确

boolean password_verify(string $password,string $hash)

demo:

<?php
$password = 'password123456';//原始密码
$new_password = '123456';
$has_password = password_hash($password,PASSWORD_BCRYPT);//使用BCRYPT算法加密密码
echo $has_password;//同一个密码每次生成的密文是不同的
if(password_verify($new_password,$has_password)) {
echo '密码匹配';
}else{
echo '密码错误';
}
?>


二、另外推荐一些算法PBKDF2、bcrypt、scrypt来加密密码。

PBKDF2它的特点:

1、可以通过调整KEY来扩展,从而避免暴力破解,通过key扩展的基本思路是,在将密码哈希后,再使用key加上哈希值再使用相同的算法进行多次的哈希。如果黑客尝试去破解的话,他会因此多花费几十亿次计算的时间。前面提到过,越慢越好,PBKDF2可以通过指定迭代次数,你想让他多慢,他就有多慢。

2、通过加盐的方式预防彩虹表的破解方式。盐是一个添加到用户的密码哈希过程中的一段随机序列。这个机制能够防止通过预先计算结果的彩虹表破解。每个用户都有自己的盐,这样的结果就是即使用户的密码相同,通过加盐后哈希值也将不同。然而,在将盐与密文存储的位置上有很多矛盾的地方,有的时候将两者存在一起比较方便,有的时候为了安全考虑又不得不将两者分开存储。由于PBKDF2算法通过key的机制避免了暴力破解,我觉得没必要将盐隐藏起来,就跟密文存储在同一个位置。

3
不需要额外的库或者工具,这是一个开源的实现,在工作环境中能很方便的使用。

bcrypt是专门为密码存储而设计的算法,基于Blowfish加密算法变形而来。其最大的好处是有一个参数(work factor)可用于调整计算强度,而且work factor是包括在输出摘要中的。随着攻击者计算能力的提高,使用者可以增大work factor,而且不会影响己有用户的登录。

scrypt不仅计算时间长,而且占用内存多。使得并行计算多个摘要异常困难,因此利用rainbow table进行暴力攻击更加困难。scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。但是,scrypt在算法层面只要没有破绽,它的安全性应该高于PBKDF2和bcrypt。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值