作为一名Web开发人员,我们经常需要与用户的帐号系统打交道。帐号系统中最重要的一个方面就是如何保护用户的密码。用户帐号数据库频繁被黑,所以 Web开发人员必须采取一些措施来保护用户密码,以免网站不断地被攻陷,通过对密码加盐(混入随机字符拼接在密码明文中)之后加密,可以增加系统复杂度,得到更强更安全的密文摘要值。
常规的登录认证(不安全)通常我们在用户通过表单提交用户名,密码两个字段查询数据库匹配,实现登录认证功能,但存在的安全隐患问题太多:
(1)数据库密码以明文的形式进行存储。(2)数据传输的过程中未对数据进行加密处理
使用md5、SHA256 、 SHA512等加密哈希函数
数据库密码加密后,校验的逻辑就发生了些变化,需要对提交的密码进行加密之后再做对比,但是这样子还是不安全,有很多方法可以从简单的哈希值中快速恢复出明文的密码。有几种易于实施的技术,使这些“破解”的效率大为降低。网上有这种专门破解MD5的网站,只需提交一个哈希值,不到一秒钟就能得到破解的结果。显然,单纯的对密码进行哈希加密远远达不到我们的安全要求
加盐处理password:明文密码
salt: 盐,一个128bits随机字符串,22字符
public static final String encryptPassword(String password, String salt) {
//加密方式
String hashAlgorithmName = "SHA1";
//盐:为了即使相同的密码不同的盐加密后的结果也不同
ByteSource byteSalt = ByteSource.Util.bytes(salt);
//密码
Object source = password;
//加密次数
int hashIterations = 1024;
SimpleHash result = new SimpleHash(hashAlgorithmName, source, byteSalt, hashIterations);
return result.toString();
}
1)、盐值不能太短;
2)、盐值不能固定;
3)、每一次修改密码重新计算hash值时,要重新生成新的盐值,不要使用上次密码对应的盐值
以上的步骤我们只是对数据库进行了加密,为了防止用户输入密码在传输的过程中被抓包工具获取,我们还要在密码传输的过程中进行加密,这样可以使得获取到的也是密文。
,