Frenlee

用户密码的设置

概述

密码的存储在一个程序中是很重要的一部分,一方面要保证其传输的安全,一方面要保证其存储的安全,虽然说这些都不能做到绝对的安全,但至少可以通过技术来减少安全问题.

下面记录下最近学习到的一个关于密码设置的知识点.

整体思路

为了防止暴库,所以在密码存储时加盐,然后密码的存储使用md5加密,前端密码传输也使用明文密码加密后的字符串.

逻辑实现

DB中

在db中,密码的存储是这样的, s=md5(password + salt),其中password是前端传递过来的密码,一般为加密过后的字符串,当然在这个密码md5加密过程可以更加复杂.salts存储在数据库.

验证

1.注册时

注册时直接传送md5(用户输入)

2.登录时

1. 从页面传来的密码字段是这样的   md5(md5(md5(pw)+salt)+ 随机数K) = P
2. PHP后台接收到P,从DB里取出该用户的密码S,做校验 if( md5(S + 随机数K) == P)

代码实现

后台代码(PHP)的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function password($password, $oPassword = false, $salt = false, $random = false)
{
if ($oPassword && $random && $salt) {
return strcasecmp($password, md5($oPassword . $random)) === 0;
} else {
$salt = Util::randomStr(12);
$password = md5($password . $salt);
return compact('password', 'salt');
}
}

// 随机值得生产
public function randomStr($length = 6 , $numeric = false)
{
PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
if($numeric) {
$hash = sprintf('%0'.$length.'d', mt_rand(0, pow(10, $length) - 1));
} else {
$hash = '';
$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ1234567890abcdefghjkmnpqrstuvwxyz';
$max = strlen($chars) - 1;
for($i = 0; $i < $length; $i++) {
$hash .= $chars[mt_rand(0, $max)];
}
}
return $hash;
}

总结

密码的存储大概就这样子,欢迎来喷.