security - 如何在不需要键盘输入的情况下创建加密安全的身份验证?

标签 security authentication cryptography

我正在开发一个系统,该系统要求用户使用他们在网站上创建的帐户登录设备。身份验证将通过 HTTPS,因此这不是问题。设备上运行的应用程序将允许使用链接到其帐户的信用卡进行应用程序内购买,因此登录凭据足够安全很重要,这样就很难使用蛮力攻击。唯一的问题是用户将使用的设备将具有有限的用户输入功能(主要是方向键和选择按钮)。

在这种情况下,典型的用户名/密码可能太麻烦而无法输入,还需要开发可通过箭头键导航的屏幕键盘。用户最终可能会创建容易破解的简单密码。但是,一旦登录,用户将在后台使用访问 token ,因此他们可能不需要多次输入密码。

第一步是用户需要输入他们的用户名或 ID 号。使用数字可能更容易输入,但也更容易猜测。我也愿意接受这方面的建议。

接下来是输入“密码”的过程。所以这里有一些我的想法,但我不是密码学专家,所以我不知道如何衡量安全级别。

  • 用户必须先注册设备。无论如何,这可能是我需要的一个步骤,以提高安全性。该设备将生成一个 key ,该 key 发送到服务器并与帐户一起存储。执行将来的身份验证请求时将需要该 key 。用户需要登录网站才能批准该设备。该设备不会有任何类型的标识符,因此除非您很快登录,否则您不会知道它是您的设备还是其他人试图欺骗您。如果能够创建某种额外的标识符,可能会显示一个短代码、短语或图像,这样您就可以知道它与您刚刚尝试注册的设备相同,那就太好了。
  • 由于输入文本密码可能太困难,只要设备已注册,在确认应用内购买时,也许可以使用 4 位密码。无论如何,这可以很好地防止设备的其他用户未经您的许可使用您的帐户。但是,如果他们正在监视您输入密码,那么这不再适用于该目的。
  • 如果不需要注册设备,而不是使用文本密码登录,用户可能会看到图像或短语作为选项,他们必须选择与他们的帐户匹配的图像/短语的正确组合。

  • 这就是我到目前为止所拥有的。你怎么看?当涉及应用内购买时,如何创建简单但安全的登录?

    最佳答案

    我一直在处理有限的用户输入能力场景。您能描述一下您的应用程序在哪个平台上运行吗?根据平台安全模型来适应解决方案是很有帮助的。

    更新:我希望您没有考虑每个设备的多用户方案。所以,我假设每台设备有一个用户。第二个假设是设备可能有一个唯一的序列号,可以通过一些 API 访问,并且序列号预先注册在服务器上。
    在初始阶段,用户通过设备选择按钮生成一个随 secret 钥,应用程序确认 key 生成成功可能会显示序列号(用户可能需要注册序列号以进行后续配置)。在幕后,应用程序将带有序列号的新 key 发送到服务器。服务器使用数据库条目中的随 secret 钥更新其序列号。设备可以阻止进一步的 key 生成,也可以允许,直到它最终配置有专用用户。设备还会在本地数据库/文件中使用随 secret 钥保存序列号。然后,用户通过 Web 界面登录其帐户以配置设备。对于登录用户,服务器提供可用设备列表,用户可以选择属于她/他的特定设备并设置四位数的密码。服务器执行以下操作:

  • 关联用户账号、序列号、随 secret 钥(设备一开始发送的那个)。
  • 生成 token
  • 通过基于密码的 key 派生算法(PBKDF2)使用密码和随 secret 钥作为盐生成 key
  • 使用在步骤 3 中派生的 key 加密 token
  • 使用密码 token 更新数据库用户行。

  • 用户可以通过设备选择按钮同步密码 token 。要解锁应用程序,用户必须通过简单的数字屏幕输入 PIN 码。该应用程序使用 PIN 码和随 secret 钥(在开始时保留)并生成 PBKDF2 key 并解密 token 。 PBKDF2 可以帮助我们稍微减慢蛮力,但也可以强制执行基于时间或基于尝试的锁定。例如,经过一些跟踪,应用程序可以删除用户凭据并强制用户从头开始配置。

    关于security - 如何在不需要键盘输入的情况下创建加密安全的身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18241318/

    相关文章:

    android - 具有离线访问和本地安全性和跨平台的类似 Google Drive/Dropbox 的解决方案

    security - "JACC Policy Provider:Failed Permission Check"在没有授权约束的安全受限登录页面上

    php - gwt ajax ssl登录

    c - 字节泛洪密码学问题(C 库)

    django - 当我通过负载均衡器登录时,我无法跟踪客户端 IP

    android - 如何在 android webview 中使用代码发送 POST 数据

    java - 安装 Android 应用程序后首次使用时创建一次登录页面

    c - 我的 Blowfish 算法是 "standard"吗?

    c# - 签名 XML 疑难解答

    Java EE 安全性 - 使用哪种方法?