现在移动互联网应用一般都会采用用户注册登录机制以便增强用户粘性。那么为了安全设计,用户的密码应该如何传输?在云端又如何保存?这个问题我思考过许久,总结以下一些思路,主要涉及到不可逆加密的使用原则。
用户的登录目的就是为了验证试图登录的用户与当初注册的用户是同一个用户。
假设用户的注册/登录过程均是在完全安全的环境下进行,例如在你自己家的个人电脑上你开发一个单机的应用,为了防止你的小孩误使用,你可很简单地设计一个用户认证系统: 设置密码将你输入的密码直接写入到你的应用的数据中,这相当是注册; 使用时你再输入密码,如果相同则通过,否则不通过,这相当于是登录。以上这个系统不需涉及到任何加密技术,仅仅是对密码进行比较即可。
然而,如果你进一步考虑,整个过程可能是在不安全的环境下进行,例如这个电脑不是你独享的,而且不是放在你家,例如在云端,例如你的登录过程操作是在手机的客户端上,再进一步,你的手机可能会丢失或被倫,你的手机和云端的电脑之前的传输可能被黑客监听,。。。
以下是注册和登录过程中密码及由它推导出来的信息(我称之为信任信息)的传递示意图:
注册:
登录:
手机应用 云端服务器
密码->传输->与持久保存的信息比较
由于传递过程的不安全性,传递的步骤越多,信息泄露和信息被篡改的代价越小。为了保证信任信息不泄露或被篡改,应该保证信任信息的传递过程是不可逆的且是确定的,例如哈希加密算法(例如md5,sha1,sha256)可达到这一目的。
不可逆的原因是保证无法通过下游的信息推算出上游的信息(例如密码),而确定的则可保证相同的上游信息经过相同的算法操作得到相同的下游结果,这样云端可以比较双方的结果即可推断出原始的上游信息信息(如密码)是相同的,以达到用户认证的效果。
上面说得有些抽象,不是很直观,那么我换一种说法,解释一下具体而言,如何在各环节(如传输/保存)对密码进行加密处理?
例如用户在注册时输入了密码,可以先做一次哈希加密,再进行网络传输,云端服务器收到后,再做一次哈希加密,然后保存起来。登录时的过程类似,云端服务器所得到或使用的信息是经过了多次(这里是2)哈希加密后的结果。
相比之下,目前有很多应用仅仅是只做一次哈希加密后传输然后就直接保存到云端服务器。这种简单的做法有什么问题呢?
这种做法看似使用了不可逆加密,但问题是没有标识出完整的可能存在安装泄露的信息传递环节, 并增加必要的哈希加密步骤。具体而言,如果云端的数据被泄露,尽管无法直接推算出密码,但可利用来给一个伪造的手机应用使用,从而达到伪造登陆的过程。
谈谈移动互联网应用的用户注册登录安全考虑之不可逆加密的应用原则
原文地址:http://blog.csdn.net/lindev/article/details/46366335