Php 使后端的六位pin系统更加安全

Php 使后端的六位pin系统更加安全,php,json,security,aes,Php,Json,Security,Aes,我正在开发一个密码管理器,它有两种形式的身份验证 首先,用户使用其密码登录。我使用bcrypt安全地工作 下一部分要复杂得多。用户保存的服务以JSON格式存储,如下所示: { "name":"facebook", "login":"myemail@email.com", "signup-email":"myemail@email.com", "password":"121654754321", "notes":"my security quest

我正在开发一个密码管理器,它有两种形式的身份验证

首先,用户使用其密码登录。我使用bcrypt安全地工作

下一部分要复杂得多。用户保存的服务以JSON格式存储,如下所示:

{
     "name":"facebook",
     "login":"myemail@email.com",
     "signup-email":"myemail@email.com",
     "password":"121654754321",
     "notes":"my security questions answer is \"blah blah blah\""
}
我计划将其存储在一个带有两个字段的DB表中:id和数据(AES256加密的JSON)

到目前为止,我的设计是使用一个6位数的pin和一个32字符的salt(每个用户都是唯一的)来加密它。pin永远不会被存储。盐存储在用户表中


这样做可能有什么缺陷?有谁能推荐一种更好的方法来实现这一点吗?

pin是已知的,只有用户才能插入?您可以使用PBKDF2(基于密码的密钥派生函数)基于该6位pin(和salt)生成安全加密密钥,而不是使用6位pin+salt对数据进行加密。这样,每个用户将拥有不同的(安全的)加密密钥。请注意,除此之外,您应该始终使用不同的加密安全生成的IV,该IV可以附加(或前置)到加密数据中

您的实现的安全缺陷在于,您的pin+salt可能没有生成足够的熵,并且由于您没有提到IV,我想您没有使用IV,从而暴露了加密数据中的可能模式

因为我的实现存在安全缺陷,这取决于您的安全目标是什么。对于大多数人来说,PBKDF2(根据PHP实现的
hash_algos()
算法之一)是足够安全的,即使它更容易受到使用FPGA或GPU集群的攻击。如果您想避免它们,可以使用bcrypt生成一个使用这些技术更难攻击的密钥

我建议您阅读这篇文章,其中给出了更深入的原因,说明了为什么bcrypt比PBKDF2更能降低风险 您的系统带来了巨大的安全挑战,因为它充当了一个中央密码存储库,因此成为了一个选择目标。你最好的防御是无知:如果你不能破译它,攻击者也很难破译。此外,您不需要访问存储的数据,但是用户(并且只有用户)需要访问

您所做的/打算做的都是正确的,因为您没有访问完整密钥的权限。但是为什么你要使用6位pin而不是“标准”密码/短语呢?您负责80%以上的加密密钥的安全性,并且您将所有密钥集中在一个地方!攻击者只需找出要添加到salt中的(非常弱的)pin即可读取数据。另外,如果您的系统被压缩,您可以设法检索用户请求,以便提取PIN并访问用户帐户

(一些)提示 那你怎么办?我不是安全专家,但我知道一些技巧。我将尽我最大的努力回答

将解密委托给最终用户 如果解密密钥从未接近您的系统,那么数据将更加安全。为了检索用户的密码列表,需要闯入该用户的计算机,以某种方式从页面检索解密的数据。这是完全可行的,在某些情况下可能比入侵您的服务器更容易,但这只允许访问一个帐户。这对你的其他用户来说很好:D

越来越多的应用程序使用这种方法来获得类似的结果。例如,您经常看到使用JavaScript完成客户端AES解密。本文描述了这样一种机制

使用强加密密钥 如前所述,在加密密钥中只保留用户6个字节并不是真正可靠的。他们需要能够增加他们喜欢的熵。有上限的密码通常是一个坏主意(我个人讨厌那些告诉我密码有多短的人)

看看 (这一点与前一点有关)

密钥拉伸描述了使用标准“人工”密码并将其转换为更强加密密钥的操作。它有许多应用程序,并且在您正在构建的几种密码管理器中使用

RSA是一种众所周知的密钥拉伸算法,用于许多安全应用程序

旁注 当然,为了构建一个安全的系统,您还需要解决其他几个问题:

  • 显然,您需要在服务器和客户端之间实施SSL(HTTPS)通信
  • 为了保护用于加密的机密,需要很好地保护对服务器的访问。客户端解密大大降低了入侵造成的威胁,但这并不意味着它们不应该受到保护。这意味着微调防火墙、最新应用程序、对安全修复的反应性等
  • 您需要向您的用户传授一两件关于安全性的知识。众所周知,通道的两端都必须安全,以便通道本身也安全
  • 可能还有很多其他问题,但嘿,这不是关于安全的讲座;-)
如果用户已明确表示使用了bcrypt,您为什么推荐PBKDF2?如果用户已明确表示使用了bcrypt,您为什么推荐PBKDF2?我对bcrypt不太熟悉。从技术上讲,我推荐关键拉伸算法,我引用了PBKDF2。但是如果OP已经使用了bcrypt,那么这个特别的建议已经实现了。这个问题似乎是离题的,因为它是关于安全的,请使用它。不过,请清楚地描述您的协议,包括应对措施和世卫组织正在做的事情。请注意,用户记住一个密码已经够难的了。如果您有一个同时需要密码和PIN的系统,那么您已经有麻烦了。此外,可以使用