我在开发中遇到的密码存储方式
最近有同事做了一个机遇用户名+密码的注册登录功能,看了它采用的密码存储的方式,我觉得不是很安全,所以我把我在开发中遇到的密码存储方式总结一下。
1.密码存储方式
1.1 明文
在我开始学习编程的时候,密码存储直接使用明文方式存储,那时候还觉得这样存储比较方便,可以很方便的修改我后台用户的登录密码。那时候我是做了一个简单的CMS系统,也没有设置精细的权限,所以那时候根本没有考虑过安全的问题。这种方式是非常不安全的,但是我觉得,如果是一个简单的个人内部使用的小系统或者作为练习,这种明文存储密码的方式也没有什么问题。
1.2 hash(明文)
那时候记得刚开始上班,做后台管理系统,密码存储的方式是直接采用MD5加密存储在数据库,那时候觉得MD5方式非常安全,肯定没问题了。但是后来很多网站出现了密码泄露的问题,才知道采用MD5方式不是安全的。常用的破解方式有暴力破解、字典和彩虹表。
1.3 hash(明文 + 盐)
再后来,我们采用明文+盐的方式,将明文加个盐进行加密处理,然后存储的数据库。当时觉得这种方式好高级啊,这样基本上就破解不了吧,但是其实这里边还是有很多的坑关键在于这个盐怎么处理,在这里我也写过好几种方式。因为这个盐处理不好,就会严重影响密码的安全性,下面我就介绍一下我遇到的几种加盐的方式。
2. 盐的几种实现
在实际的开发中,我主要使用过以下几种加盐的方式:统一的盐、用户不可变的特征信息、随机盐(保存在数据库)、随机盐(从密码中获取)。
2.1统一的盐
在整个系统中,确定一个统一的盐,即所有用户的密码都使用统一的盐来处理,即所有用户的密码中的盐都是同一个字符串,这种方式一旦这个盐泄露了,那就等于这个密码存储方式是没有加盐,安全性比较低。
2.2 用户不可变的特征信息的盐
以用户不可变的特征信息作为盐,如果系统中某些用户的信息不予许修改,比如用户名或者手机号等,可以使用这种方式进行密码存储。但是一旦这种盐的代码逻辑泄露,仍然是和没有加盐一样,并且这种方式对业务不是很友好,那就是不允许你的手机号、用户名等信息不能修改,所以适用范围比较窄;
2.3随机盐(保存数据库)
后来借鉴了一些开源项目的做法,就是采用随机盐的方式,用户注册时候将密文和盐分别存储在数据库中,其中每当用户注册的时候,按照随机算法,随机生成不同的盐。这种方式本以为是很安全的了,但是这种方式其实风险很大,因为一旦你的数据库泄露了或者是程序员本身想做一些事情的,这就很容易进行密码的破解了,所以内部的安全性很低了。
2.4随机盐(从密码取)
这种方式也是采用随机盐,但是这里的随机盐不再存入数据库中,而是从密码中取。使用更复杂的单向加密算法比如Bcrypt,不再将盐存储到数据库中,这样即使我们的数据库被泄露,也不会出现什么问题。至于Bcrypt算法,我们以后找机会再详细分析。
3.小结
以上就是我自己开发中使用或者看到过密码存储方式,目前我主要使用复杂的单向加密算法Bcrypt来做明文的加密。