加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

设计安全的账号系统的正确姿势

发布时间:2016-09-06 13:59:08 所属栏目:安全 来源:简书
导读:最近有个虚拟练习项目,涉及到系统安全保障的设计,于是对安全保障这块做了一些更深入的了解。发现了很多有趣的东西,开阔了眼界。中间查了一些资料,于是我打算重新整理,

就算 salt 值动态从服务端获取,也有可能被中间人拦截获取。同时,客户端的加盐 hash 的过程相当于是完全暴露的。一种更安全的做法是,客户端使用 javascript 进行加盐 hash,把结果传到服务器后,服务器对结果再进行一次 加盐 hash 或者 加密 hash(比如:HMAC) ,然后再和数据库的结果进行比对。

如果需要达到更高的安全等级,可以考虑:

1. 使用更安全的 hash 函数用来抵抗碰撞攻击,比如:SHA256, SHA512, RipeMD, WHIRLPOOL。

两个不同的内容 hash 的结果可能相同,攻击者在不知道真实密码的情况下,使用其他密码进行碰撞攻击从而登录系统。使用更安全的 hash 函数可以减少这种情况的发生。

2. 可以使用一种大量消耗 cpu 的 hash 算法对抗暴力破解,比如PBKDF2 或者 bcrypt。

暴力破解就是枚举所有可能的密码进行尝试验证,使用大量消耗 cpu 的 hash 算法可以极大增加暴力破解的时间。

3. 比较加盐 md5 结果时,使用时间恒定的比较函数。

在比较两个字符串时,通常都一个字符一个字符进行比较,如果某个字符不匹配就会立即返回。攻击者可以根据验证的时间长短来判断前几位字符是否正确,然后逐步修正最终得到正确的结果。

因此,在比较 hash 时,使用时间恒定的比较函数,可以让攻击者摸不着头脑。比如下面这段代码:

网络安全 网站拖库 密码泄露

异或(^)操作可以用来判断两个字符是否相等,比如:

网络安全 网站拖库 密码泄露

上面的函数枚举每个字符进行异或判断,然后将所有的结果取或运算,得到最终的结果,比较的时间是恒定的。

4. salt 的值不要和最终 hash 的结果存在同一个数据库。

SQL 注入是常见的攻击手段,被注入后数据库里的数据被暴露无遗。所以,应该将 salt 分开存储,存到别的机器的数据库里,让攻击者拿不到 salt ,从而无法轻易破解信息。

5. 最终存储的结果使用基于 key 的 hash 函数,比如 HMAC。 key 从外部安全性极高的专属服务中获得。

有了这层加固,即使数据被拖库,攻击者也无法从 hash 的结果逆推回原始密码。因为使用了加密的 hash 函数。基于 key 的 hash 函数只是进行哈希运算时,除了传入原始内容外,还需要传入一个密钥(key)。攻击者没有 key 几乎不可能对数据进行解密。

key 可以保存在极高安全性的通用的 key 管理系统,使用加密协议传输,对访问者进行验证,只允许特定的机器有权限访问。

用正确的姿势传输数据

使用 HTTP 协议传输数据时,数据都是明文传输的,数据从发出到服务器接收,中间可能被劫持,篡改。比如常见的 DNS 劫持,HTTP 劫持,中间人攻击。

用正确的姿势传输数据,目的就是为了保证传输的数据安全,简单归纳为两点:

需要确保进行通讯的服务端是官方的、正确的服务端,而不是跟一个假的服务端在通信。 确保信息在网络上传输时是加密的,只有客户端和服务端有能力对数据进行解密。 确保信息在传输时不被篡改,或者数据被篡改时能立即发现。 1. 验证服务端的合法性

《改变未来的九大算法》一书中提到了公钥加密和数字签名技术,这是进行安全通信的基础技术保障。这里涉及到了加密技术,先了解两个最基础的概念:

对称加密:加密和解密时使用的是同一个密钥。 非对称加密:需要两个密钥来进行加密和解密:公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥) ,公钥加密的信息只有私钥才能解开,私钥加密的信息只有公钥才能解开。

非对称加密是实现验证服务端合法性的基础,常见的加密算法有 RSA 、 ECC 等 。服务端生成一对公钥和私钥,公钥是公开的所有人都知道,客户端需要和服务端通信时,使用该公钥进行数据加密,由于只有真实合法的服务端才拥有对应的私钥,所有只有真实的服务端才能解密该信息,然后返回数据给客户端时,使用客户端自己生成的公钥进行加密,这样数据只有对应的客户端才能理解。

设计安全的账号系统的正确姿势

使用 HTTPS 时,数字证书里包含了名称和公钥信息,只要认证该证书是合法的,并且对方能理解用该公钥加密的信息,就能确定是合法的服务端。

2. 确保通信的安全

既然使用非对称加密的方式,可以保证双方安全的通信,那是不是就一直使用非对称加密传输数据就行了?理论上是可以的,但是非对称加密的效率要比对称加密的效率低很多。通常的做法是,通过非对称加密的方法,协商出一个只有双方知道的对称加密密钥。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读