保护没有密码的登录系统

时间:2012-05-24 23:17:13

标签: security password-protection

我正在为公司开发移动应用程序。公司的每个人都有一个@ company.com电子邮件地址。该应用程序本身是保密的,因此它只会安装在员工的设备上。此应用程序与外部服务器通信以存储和检索数据。

理想情况下,我想要完成的是让人们只需提供他们的电子邮件地址而无需密码即可登录应用程序。这是我目前的想法:

  1. 新用户首次在某台设备上打开该应用并输入其电子邮件地址。电子邮件地址与应用程序中嵌入的静态令牌一起发送到服务器(对于应用程序的所有实例都是相同的)。
  2. 服务器验证令牌以及电子邮件地址为@ company.com的事实。它以新的令牌/密钥响应,仅用于该用户和设备,客户端在本地以纯文本形式存储。该密钥实际上是用户的密码。它经过哈希处理,存储在服务器数据库中,并标记为已禁用。
  3. 此时有两种可能性:
    1. 服务器向该地址发送一封电子邮件,确认他们要登录新设备。该电子邮件包含一个链接,单击该链接会将该密钥标记为已启用。需要对新设备请求进行速率限制,以便在有人发现应用程序中嵌入的令牌时,人们不会收到垃圾邮件。
    2. 管理员专门批准新设备请求。
  4. 对服务器的每个后续客户端请求都必须包含密钥。
  5. 假设所有通信都通过SSL,这听起来像是一种安全策略吗?是否有更安全或更简单的方法?

    此外,生成将存储在客户端的令牌的最佳方法是什么?由于我希望用户在第一次使用该应用时只放入他们的电子邮件地址,我相信这个令牌永远不会改变。这是我当前的算法(PHP)松散地基于Drupal的drupal_get_token():

    // Usage: get_token($email) or get_token($client_token)
    function get_token($value = '') {
      $salt = hash('sha256', 'Some static, predefined phrase');
      $hmac = base64_encode(hash_hmac('sha256', $email, $salt, TRUE));
      return $hmac;
    }
    

    正如您所看到的,它不能防止并发攻击(例如,如果有人想出预定义的短语和算法并且他们可以访问数据库,他们可以生成哈希并将它们与存储在数据库中的哈希进行比较)但是因为原始密钥值已经很长,我认为这不会像对普通密码那样有效。另外,我不确定创建动态盐的方法,如果攻击者可以访问数据库,那么攻击者就无法访问它(或者老实说,如果它在那时甚至是重要的,因为访问数据库会暴露数据无论如何我们都试图保密。

1 个答案:

答案 0 :(得分:1)

经过一些研究和更多思考,我相信这个问题的答案归结为本地存储的漏洞。由于在这种情况下可以安全地假设只有公司员工才会使用该应用程序,因此即使代码中存在可能导致恶意代码运行的恶意代码,也存在无可比拟的恶意代码运行风险。因此,主要风险来自其他一些应用程序利用操作系统本地存储实现中的安全漏洞来读取磁盘上的本地私钥。由于应用程序的存在不应该为公司外的任何人所知,因此这些信息不太可能直接针对。所以我认为这对这家公司来说是一个可以接受的流程。

在一般情况下,任何考虑实施类似模型的人都应该意识到基本上在本地以纯文本形式存储密码的风险。 (这与将密码存储在用户头部相反,或者同样可能以明文形式存储在计算机上其他位置的密码文件中;这是您的通话更安全。)