有些应用程序需要在本地保存用户密码,该方案设计了一种更安全的本地存储密码方案。


1安全要求


1.1实现


1。为了防止攻击者获取用户的密码来防止明文攻击者得到自动登录令牌,总是可以土地即使两个用户相同的密码,加密密码保存的服务器是不一样的可以删除服务器中的盐,让用户登录令牌失效自动,需要手动登录用户登录多个终端,每个终端同一账号,自动登录功能的影响


1.2非实现


1、更安全的解决方案可以做将本地保存的文件复制到其他客户端,登录失败,取决于客户端处理,该方案没有实现,并且一些程序采用RSA非对称加密。该方案直接采用AES对称加密。


2应用场景分析


2.1 A在注册时


aeskey =前面的关键clientsalt和后端clientsalt =客户端生成随机8字符(从0-9a-za-z),hashedpassword = SHA1(明文密码),encryptedpassword = Base64(AesEncrypt(clientsalt + hashedpassword,AesKey)):


1。注册时,客户端提交encryptedpassword服务器的注册界面,并提取clientsalt + hashedpassword AesKey,因为clientsalt固定22字节,可以计算HashedPassword。


登记成功后,由服务器保存用户密码是SavedPassword。生成方法如下:


serversalt =服务器随机产生8个字符(选自0-9a-za-z),SavedPassword = Base64(AesEncrypt(serversalt + hashedpassword,服务器的私钥)):


1。与serversalt,即使两个用户有相同的密码,最后encryptedpassword将会不同。用户密码不存储在数据库中的数据库。


2.2手动登录


描述:


1。客户在提交encryptedpassword手动登录界面(当生成方法是注册2.1)


2。服务器验证过程:


1)从AesKey客户的解决方案hashedpassword encryptedpassword


2)从与服务器的私有密钥数据库SavedPassword hashedpassword溶液


3)比较两hashedpassword


4)成功发送回客户端saltexpire和autologintoken,生成如下:


盐=随机8字符(选自0-9a-za-z)saltexpire =盐最后有效时间autologintoken = Base64(AesEncrypt(盐+ hashedpassword,服务器的私钥))5)保存用户ID,在缓存中食盐和ID。


三.客户端的本地存储saltexpire和autologintoken,和明文密码不保存


4,客户不能解决hashedpassword因为不知道AES密钥的服务器


2.3自动登录


1,客户端首先判断是否已过期,根据当地的saltexpire,需要手动登录


2。当客户不过期,客户端提交autologintoken在自动登录界面


三.服务器验证过程:


1)从AutoLoginToken盐和HashedPassword的解决方案


2)用户ID的盐是否已过期在盐缓存表单中


3)比较两hashedpassword没有过期


4)当验证成功,一个新的盐,SaltExpire,和autologintoken构造,和SaltExpire和AutoLoginToken返回给客户端


5)保存用户ID,新的盐,并在Redis的SaltExpire,和老盐去除


4。客户端更新SaltExpire和本地存储autologintoken


5。当有一个风险,需要用户手动登入,用户的saltexpire可清理。


自动降落时间超过2.4个终端


多个终端会产生一个以上的盐/ saltexpire执行2.2手动登录过程。自动登录后,终端会产生新的盐,但旧的盐将被删除,但不会影响另一个终端的自动登录,因为所用的盐是不同的。