`
thinkry
  • 浏览: 39500 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

本地存储密码的安全设计

阅读更多
有些应用需要把用户密码保存在本地,本方案设计了一种较为安全的密码本地存储的方案。

1 安全要求
1.1 要实现的
  1. 防止攻击者得到用户密码的明文
  2. 防止攻击者拿到自动登录token后,一直都可以登陆
  3. 即使两个用户的密码相同,服务器保存的密文密码也不一样
  4. 可在服务器端清除salt,让用户的自动登录token失效,需手动登录
  5. 用户在多个终端登录同一个帐号,各终端的自动登录功能都生效


1.2 不实现的
  1. 更安全的方案能做到“把本地保存的文件复制到其他客户端”登录就会失效,这依赖于客户端做处理,本方案不实现
  2. 有的方案采用RSA非对称加密,本方案直接采用AES对称加密


2 APP场景分析
2.1 注册时
AesKey = 前后端约定好的密钥
ClientSalt = 客户端随机生成8个字符(从0-9A-Za-z中选)
HashedPassword = SHA1(明文密码)
EncryptedPassword = Base64(AesEncrypt(ClientSalt + HashedPassword, AesKey))


说明:
  1. 注册时客户端在注册接口里提交EncryptedPassword
  2. 服务器用AesKey解出ClientSalt + HashedPassword,因为ClientSalt固定22字节,能计算得到HashedPassword


注册成功后,服务器保存的用户密码是SavedPassword。生成方法如下:
ServerSalt = 服务器随机生成8个字符(从0-9A-Za-z中选)
SavedPassword = Base64(AesEncrypt(ServerSalt + HashedPassword, 服务器专用密钥))


说明:
  1. 有了ServerSalt,即使两个用户的密码相同,最后的EncryptedPassword也会不一样。
  2. 用户密码在数据库中没有明文存储。


2.2 手动登录时
说明:
1、客户端在手动登录接口里提交EncryptedPassword(生成方法同2.1注册时)
2、服务器验证的过程:
    1) 用AesKey从客户端的EncryptedPassword里解出HashedPassword
    2) 用服务器专用密钥从数据库的SavedPassword里解出HashedPassword
    3) 比较两个HashedPassword
    4) 验证成功后返给客户端SaltExpire和AutoLoginToken,生成方式如下:
Salt = 随机8字符(从0-9A-Za-z中选)
SaltExpire = 该Salt最后有效时间
AutoLoginToken = Base64(AesEncrypt(Salt + HashedPassword, 服务器专用密钥))

    5) 把用户ID、Salt和SaltExpire保存在Salt缓存表中
3、客户端本地存储的是SaltExpire和AutoLoginToken,没有保存明文密码
4、客户端因为不知道服务器的Aes密钥,无法解出HashedPassword

2.3 自动登录时
1、客户端先根据本地保存的SaltExpire来判断是否已过期,过期需要手动登录
2、未过期时,客户端在自动登录接口里提交AutoLoginToken
3、服务器验证的过程:
    1) 从AutoLoginToken解出Salt和HashedPassword
    2) 在Salt缓存表里查询该用户ID的此Salt是否已过期
    3) 未过期的情况下对比两个HashedPassword
    4) 验证成功时,构造新的Salt、SaltExpire及AutoLoginToken,把SaltExpire和AutoLoginToken返回给客户端
    5) 把用户ID、新的Salt和SaltExpire保存在redis中,老的Salt清除掉
4、客户端更新本地存储的SaltExpire和AutoLoginToken
5、在出现风险需要用户手动登录时,可以把用户的SaltExpire清零来实现

2.4 多终端自动登陆的时间
多终端在执行2.2手动登录过程时,会生成多份Salt/SaltExpire,一个终端自动登录后会产生新的Salt(老的那个Salt会清除掉),但不会影响另一个终端的自动登录,因为用的Salt本来就不同。
1
0
分享到:
评论
2 楼 sp42 2017-07-16  
怎么 “防止攻击者拿到自动登录token后,一直都可以登陆” ?是不是客户端自己先判断 SaltExpire 是否已经过期?就是说这个 token 无论如何都会定期刷新的?
1 楼 sp42 2017-07-13  
非常好 通俗易懂

相关推荐

    本地密码储存读取器本地密码储存读取器

    在实际使用中,本地密码储存读取器可以帮助用户检查和审计他们的密码安全状况。例如,它可以找出重复使用的密码,或者那些强度较低、易于被破解的密码。用户可以通过这种方式提升自己的密码管理策略,避免因单一密码...

    查看svn本地已保存的密码TSvnPwd

    TSvnPwd通过读取SVN客户端存储的凭证信息来实现密码恢复,这些信息通常存储在本地的SVN配置文件或操作系统的安全凭据存储中。 对于"标签"中的"svn",它是Subversion的缩写,是一种集中式的版本控制系统,允许团队...

    安卓的本地密码实现Demo sharedpreference

    在Android应用开发中,本地数据存储是至关重要的一个环节,特别是在涉及到用户隐私和安全的数据时,比如密码。在这个“安卓的本地密码实现Demo sharedpreference”中,我们主要探讨的是如何利用Android内置的...

    ios的随机密码生成器,支持密码的本地于服务器存储

    标题中的“ios的随机密码生成器,支持密码的本地与服务器存储”表明这是一个iOS应用程序,其主要功能是生成随机密码,并且具备将这些密码安全地存储在设备本地以及云端的能力。这样的应用通常是为了帮助用户创建强...

    C# 在本地记住密码并加密的DEMO

    4. **加密(Encryption)**:为了保护用户的密码安全,DEMO采用了加密技术。可能使用的是.NET框架提供的加密服务,如`System.Security.Cryptography`命名空间下的`Aes`(AES,高级加密标准)或`RijndaelManaged`...

    高度便携的极轻量级密码管理器可将您的所有密码存储在本地加密文件中

    这种管理器通常设计为小巧、快速,并且可以在多种设备上使用,无需安装,只需要一个本地加密文件即可存储密码数据。这种本地加密文件确保了用户数据的安全性,防止未经授权的访问。 【描述详解】 描述进一步强调了...

    foxmail本地密码提取器

    "foxmail本地密码提取器"正是为了解决这类问题而设计的工具,它能够帮助用户提取或恢复Foxmail客户端中存储的本地账户密码。 首先,我们需要理解Foxmail是如何存储密码的。Foxmail为了保障用户数据安全,通常会将...

    查看本地的svn密码(非常方便)

    TSvnPwd是一个小巧且实用的工具,专为查看本地SVN密码设计。它能够解析`.subversion`文件夹中的凭证信息,并显示在界面上,让你轻松找回遗忘的密码。只需运行`TSvnPwd.exe`这个程序,它会自动扫描并列出所有已保存的...

    win本地 svn账号密码查看

    为了防止类似问题再次发生,建议用户定期更新密码,并使用密码管理器来安全地存储复杂密码。同时,对于重要的svn仓库,应启用多因素身份验证以提高安全性。 总而言之,遗忘的svn账号密码可以通过TSvnPwd这样的工具...

    实现记住密码功能

    - 避免在本地存储敏感信息,如用户全名、地址等,以减少泄露风险。 综上所述,实现“记住密码”功能不仅涉及前端的存储和交互设计,还必须考虑到安全性和合规性,以保护用户的个人信息安全。在开发过程中,要充分...

    SQLite数据库 ,实现本地、登录、注册、 修改、注销账号、记住密码

    - **密码存储**:密码不应以明文形式存储,而是应使用安全的哈希算法(如SHA-256或bcrypt)进行哈希处理,并可能添加盐值以增加破解难度。 - **密码修改**:用户请求修改密码时,旧密码首先会被验证,然后用新密码...

    adsl拨号宽带密码本地获取工具(一键宽带密码获取) v1.0 绿色版.zip

    标签为“杀毒安全-密码相关”,这表明此工具可能具备一定的安全特性,例如,它可能经过了杀毒软件的检测,确保没有携带恶意代码,同时专注于处理与密码安全相关的问题。使用这类工具时,用户不必担心软件会对系统...

    TSvnPwd查看本地SVN密码,再也不怕忘记密码了

    "TSvnPwd"就是为了解决这个问题而设计的实用工具,它能帮助用户方便地查看本地SVN存储的密码。 TSvnPwd是一款小巧但功能强大的程序,它的主要功能是读取和显示保存在Subversion配置文件中的凭据信息,包括用户名和...

    Android本地wifi密码查看器源码

    对于查看WiFi密码,由于这些信息存储在受保护的系统区域,因此需要root权限来突破安全限制。 2. **WiFi配置文件**:Android设备上的WiFi密码存储在系统数据库中,通常是 `/data/misc/wifi/` 目录下的 `wpa_...

    本地无线网卡密码查看器

    这个小软件专门设计用于帮助用户检索储存在本地计算机上的无线网络连接密码。 首先,我们需要理解无线网卡的工作原理。无线网卡是一种硬件设备,它允许计算机通过无线方式接收和发送数据,通常使用的是Wi-Fi技术,...

    本地Wifi密码查看工具.zip

    标题中的“本地Wifi密码查看工具.zip”表明这是一个压缩文件,其中包含了一个用于查看本地计算机上已连接过的Wi-Fi网络的密码的程序。这个工具可能是针对Windows操作系统设计的,因为大多数个人电脑用户通常在...

    TortoiseSVN本机密码查看器(win10需要先安装 .net 20)

    在Windows 10上,当你下载并运行"TSvnPwd.exe"后,它会读取TortoiseSVN在本地存储的密码信息。这些密码通常是以加密形式存储在本地的,以保护用户的隐私安全。"TSvnPwd.exe"能够解密这些密码,显示所有与TortoiseSVN...

    密码登录验证程序设计,VB6.0源代码编写

    这涉及在本地存储用户凭据(但需注意安全问题,如使用安全的本地存储机制)。 7. **多层安全**:高级系统可能会采用双因素认证,例如短信验证码或生物识别。但这超出了VB6.0的基础应用范围。 8. **代码结构**:...

    Thecns存储原厂恢复密码工具

    【Thecns存储原厂恢复密码工具】是专为解决Thecns品牌存储设备的密码遗忘问题而设计的一款实用工具。在日常运维中,管理员可能会因各种原因忘记控制台(console)口的登录密码,这将导致无法正常访问和管理存储系统...

Global site tag (gtag.js) - Google Analytics