Php 在移动服务器通信中使用密码作为加密密钥的一部分

Php 在移动服务器通信中使用密码作为加密密钥的一部分,php,android,ios,security,encryption,Php,Android,Ios,Security,Encryption,我目前正在开发一个移动应用程序,它附带了一个用PHP开发的web服务。我们要确保的一件事是,用户数据以各种可能的方式都是安全的 经过仔细评估,我们决定将其用于所有与加密相关的内容。这是对HTTPS连接的补充。当前流程如下所示(登录示例): iOS上的库在将密码发送到服务器之前使用密钥加密密码 然后服务器将此加密密码存储在数据库中 重新授权时,应用程序发送密码(再次使用静态密钥加密),服务器解密密码(意味着服务器也有加密密钥),验证登录并将登录密钥(使用相同的静态密钥加密)发送回客户端 每个后续请

我目前正在开发一个移动应用程序,它附带了一个用PHP开发的web服务。我们要确保的一件事是,用户数据以各种可能的方式都是安全的

经过仔细评估,我们决定将其用于所有与加密相关的内容。这是对HTTPS连接的补充。当前流程如下所示(登录示例):

  • iOS上的库在将密码发送到服务器之前使用密钥加密密码
  • 然后服务器将此加密密码存储在数据库中
  • 重新授权时,应用程序发送密码(再次使用静态密钥加密),服务器解密密码(意味着服务器也有加密密钥),验证登录并将登录密钥(使用相同的静态密钥加密)发送回客户端
  • 每个后续请求都依赖于加密的登录密钥和用户名来验证用户和登录会话的有效性
  • 我相信上面的系统是有缺陷的,因为静态加密密钥以及密钥在服务器和客户端都可用

    我们希望通过将原始密码与静态加密密钥合并,使加密密钥成为动态的。这将使加密密钥对每个用户都是唯一的,但也意味着服务器将不知道密钥。服务器必须知道密钥,因为其他用户数据也会根据该密钥进行加密和解密

    有人能帮我解决这个问题吗?我需要采取哪些步骤使系统更加安全?任何特定于服务器移动客户端的代码片段或引用链接也可以。我知道有很多教程,但大部分都是将客户端恢复为基于web的,而不是移动的


    PS:很抱歉发这么长的帖子。

    我可能只会使用OATH2令牌进行身份验证,但如果您想用自己的方式进行验证

    为了确保密码的安全,使用了salted散列。作为用盐散列密码的一个基本示例,请考虑下面的内容,并且记住它不是加密安全的。
    shaResult=SHA1(16字节随机盐)p@ssword“”

    基础知识:服务器存储shaResult。你的应用程序存储生成的salt值。当用户输入密码时,您将其附加到存储的salt中,对其进行散列,并将其发送到服务器进行验证。现在真的不需要将其加密到服务器。HTTPS连接应该可以处理这个问题

    好的加密密码散列在中进行了详细描述,总结他们建议使用以下方法:

  • 应使用加密安全的伪随机数生成器(CSPRNG)生成Salt。多个编程/脚本语言的链接中给出了建议的CSPRNG
  • salt需要每个用户每个密码都是唯一的。每次用户创建帐户或更改密码时,都应该使用新的随机salt对密码进行哈希处理。不要重复使用盐。盐也需要很长,所以有很多可能的盐。根据经验,makeyoursate至少与hash函数的输出一样长。salt应该与散列一起存储在用户帐户表中
  • 使用经过良好测试的加密哈希算法,如SHA256、SHA512、RipeMD、WHIRLPOOL、SHA3等
  • 使用执行多次迭代的慢速哈希函数。标准算法包括和
  • 使用键控哈希算法

  • 我将重申,安全连接仍然需要与上述功能结合使用 在设置时,在客户端和服务器之间建立共享密钥。这必须安全地完成,可以使用SSL或侧通道通信

    身份验证:

  • 服务器向客户端发送随机质询
  • 客户机使用质询值计算具有PBKDF2等函数的哈希,并将其与用户标识符一起发送到服务器
  • 服务器执行相同的计算并验证其用户标识符/共享密钥表中的值
    虽然有一些细微的变化,但概念是相同的。

    我不能完全确定这是否是您想要的,但这可能会帮助您--功能原理可能会给您提供想法。这个问题似乎是离题的,因为它是关于@owlstead的,我既不试图定义协议,也不试图创建协议。我所要做的就是找出使用现有协议的正确方法。如果你觉得它离题了,请随意标记。但答案是相关的,对我有帮助。是的,但它也应该是相关的,不会让未来的读者感到困惑。目前,您似乎在这个问题上混合了实现和设计。如果您在security.stackexchange.com上询问与协议相关的问题,并在此处询问与开发相关的问题,您和其他人将获得更高质量的答案。这是一个很好的话题,否则,我没有投反对票或任何东西。谢谢!这些链接有帮助(尤其是第二个链接)!!投票被否决,因为这个答案明显忽略了第二个链接中给出的建议。对于给定的问题,它也远不是一个完整的解决方案。因为我的示例使用了SHA1而不是SHA256?只有将注释作为答案输入时,我才会将其标记为正确答案。无论如何,感谢@raz和@Mihai Andrei Rustiuc的宝贵意见。我已经用哈希和RNCryptor找到了正确的方法。没有,因为您的示例没有使用PBKDF(基于密码的密钥派生函数)来执行哈希。您使用了salt,但没有迭代计数或工作因子。已知的PBKDF是PBKDF2、bcrypt和scrypt。还要注意,您知道编码