security - 无需密码即可保护登录系统

标签 security password-protection

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

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

  1. 新用户在特定设备上首次打开应用并输入其电子邮件地址。电子邮件地址连同嵌入应用程序中的静态 token (对于应用程序的所有实例都相同)发送到服务器。
  2. 服务器验证 token 以及电子邮件地址为 @company.com 的事实。它使用新的 token / key 进行响应,仅用于该用户和设备,客户端以纯文本形式存储在本地。该 key 实际上是用户的密码。它经过哈希处理,存储在服务器数据库中,并标记为禁用。
  3. 此时有两种可能:
    1. 服务器会向该地址发送一封电子邮件,确认他们想要在新设备上登录。该电子邮件包含一个链接,单击该链接会将 key 标记为已启用。需要对新设备请求进行速率限制,这样如果有人发现应用程序中嵌入了 token ,人们就不会收到垃圾邮件。
    2. 管理员专门批准新设备请求。
  4. 每个后续客户端向服务器发出的请求都必须包含该 key 。

假设所有通信都通过 SSL,这听起来像是一个安全策略吗?有更安全或更简单的方法吗?

此外,生成将存储在客户端的 token 的最佳方法是什么?由于我希望用户仅在第一次使用该应用程序时输入他们的电子邮件地址,因此我相信此 token 永远不会改变。这是我当前的算法(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;
}

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

最佳答案

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

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

关于security - 无需密码即可保护登录系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10746602/

相关文章:

javascript - 如何从另一个站点安全地将表单发布到 django 站点

security - 隐藏 X-Powered-By (nginx)

PHPMailer 受密码保护的附件

maven - mvn --encrypt-master-password <密码> 如何工作?

java - Java中通过发送数据暴露信息

php - PHP 中的输入过滤

objective-c - 每次从 ios 应用程序的钥匙串(keychain)访问中获取钥匙串(keychain)保存的密码时返回 "0"

mysql - 如何安全地存储密码以备后用

java - Apache POI 锁定单元格但允许调整列大小

linux - 将文件从一个用户主目录复制到 Linux 中的另一个用户主目录