如何使用用户友好的客户端密码实现强大的服务器端帐户密码

Tys*_*son 5 .net security encryption

我要求允许用户在单个设备上使用4+数字引脚式密码.显然,这是一个不好的密码,可以直接用于保护他们的服务器端帐户,因此我想将此PIN"锁定"到特定设备,以便某人必须同时拥有PIN和设备才能登录,以及获取访问权限的位置.设备无法访问PIN.此外,他们已经拥有更常规的用户名/密码登录,并且通过在设备上注册,他们正在为此现有帐户添加一组新的登录凭据.所以这是我目前的计划:

  1. 在本地设备注册过程中,本地生成强密码.
  2. 将此生成的强密码作为服务器端设备特定帐户密码发送到服务器.
  3. 使用提供的4位数密码对本地对称加密强生成的密码.
  4. 将此加密的强密码存储在本地设备上.
  5. 在该设备上的后续登录期间,用户提供相同的4位数密码,用于解密先前存储的强密码,并将强密码发送到服务器以进行登录.

所以我相信这实现了强大的服务器端密码要求.但是,我还需要在注册过程之后尽可能地保护自己能够抵御受到破坏的客户端设备(在注册过程之前/期间受损的设备是丢失的原因).显然,使用4位加密密钥,只有10,000种可能的组合,因此攻击者可以很容易地快速尝试本地加密的强密码的每种组合.我想知道的是,我是否必须选择特定的对称加密方案和/或生成的密码格式,以便攻击者无法单独从本地数据中分辨出哪些10k解密尝试是正确的?即他仍然必须在服务器端登录时尝试每个10k密码.

此外,这种方法或实现这些要求的更标准方法是否存在明显错误?如果有标准方法,是否有针对此方法的标准.NET库?

Maa*_*wes 4

您可以在本地设备中存储盐并使用 PBKDF2 计算 key1。然后使用该密钥服务器端使用单独存储的盐来计算 key2。由于 key1 从未被存储,因此攻击者没有所需的信息。