Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 确保密码安全_Security_Networking_Password Protection - Fatal编程技术网

Security 确保密码安全

Security 确保密码安全,security,networking,password-protection,Security,Networking,Password Protection,情况1-将服务器连接到数据库: 它总是说密码不应该存储在纯文本中,但是连接到mysql数据库需要密码,在纯文本中似乎。。。我想最好的解决办法是以加密的形式存储它,根据需要在我的应用程序中解密它,然后从内存中删除它(我想windows中的SecureZeroMemory会让编译器无法优化它) 情况2-用户从远程计算机登录到服务器: 至于用户密码,我的计划是根本不存储原始密码。 相反,我将为每个用户存储一个随机生成的“salt”,在密码前面加上前缀,然后对其进行散列,这似乎是一种比较常见的方法。但是

情况1-将服务器连接到数据库:
它总是说密码不应该存储在纯文本中,但是连接到mysql数据库需要密码,在纯文本中似乎。。。我想最好的解决办法是以加密的形式存储它,根据需要在我的应用程序中解密它,然后从内存中删除它(我想windows中的SecureZeroMemory会让编译器无法优化它)

情况2-用户从远程计算机登录到服务器:
至于用户密码,我的计划是根本不存储原始密码。 相反,我将为每个用户存储一个随机生成的“salt”,在密码前面加上前缀,然后对其进行散列,这似乎是一种比较常见的方法。但是我现在没有可用的SSL连接,所以我猜纯文本密码可能会被拦截,有什么好的解决方案

什么是好的算法(如果你有C/C++实现的链接,也会很方便)要做到这一点,网上一看就有100个

编辑:
如果我得到了SSL,那么以下是安全的(假设使用了强哈希算法),还是应该使用不同的方法

  • 客户端请求salt输入用户名
  • 客户端用salt作为密码的前缀,然后在将哈希发送到服务器之前对密码进行哈希
  • 服务器将收到的哈希值与服务器上该用户名的哈希值进行比较

  • 如果不使用SSL,则可以拦截密码,这是正确的

    通常的做法是永远不要解密用户的密码,因此请使用salt对其进行散列存储,当用户键入密码时,您将添加salt并对其进行散列,并将其与存储的散列密码进行比较。这将使您永远不会每次都有密码的解密版本

    您确实应该研究连接的安全性,以便在用户键入密码时密码是安全的

    更新以回答已编辑的问题:

    如果您使用SSL保护通信,您仍然可以使用任意数量的额外安全措施,包括散列密码。为了增加安全性,最好记住存储的密码应该用盐散列存储。盐应该是安全的,除了你的应用程序外,任何地方都不能使用。这样,当用户提交密码时,您只需添加salt和hash,然后将该版本与存储的版本进行比较

    不确定这是否是你想要的。 但是一个使用内置sha1函数的简单PHP示例:

    // Check the hashed password from the database
    if (sha1($salt.$password) == $providedPassword)
    {
        // User is authenticated
        return TRUE;
    }
    else
    {
        // User is not authenticated    
        return FALSE;
    }
    
    您可以做的一件事是在通过网络发送密码之前,使用javascript对密码进行散列。问题是客户端和服务器之间如何共享salt字符串?一种可能性是使用会话变量。然后在服务器上使用session变量解除密码的锁定。这意味着中间的人需要知道另一条信息来理解密码。不像SSL那样安全,但可能有一个额外的防御层来抵御偶然的网络嗅探器

    我还可以想象一个哈希方案链接到某种验证码系统,用于在通过有线发送之前在本地客户端上加密密码。客户端将通过完成验证码来提供salt字符串的文本。你可以在你这边查

    主要关注的是中间人不理解明文密码。
    应使用SSL,但在无法使用SSL的情况下,上述技术可能会有用。

    将服务器连接到数据库

    仅仅将数据库密码存储在服务器中(加密与否)是个坏主意。当然,将其存储为纯文本是显而易见的。如果只是将其加密存储,服务器仍然需要密钥来解码。在服务器代码中找到密钥通常不是很难。最好的解决方案是让启动服务器的用户输入密码并将其存储在任何地方。或者——可能更好——您可以将所有敏感信息(例如数据库用户、密码等)存储为加密信息,并让启动服务器的用户输入主密钥来解密这些信息

    将用户连接到服务器

    这确实是一个很难解决的问题,而且很容易搞砸。关于这个话题的一段引文,我绝对推荐阅读

    不,真的。使用其他人的密码系统。不要建造你自己的


    一个好的解决方案可能是使用。

    较新的MySQL使用在线哈希密码,因此您不必担心中间人

    如果担心配置文件中存储的密码,可以使用密码加密配置文件。但是,问题是您必须输入密码才能启动应用程序


    我在15年前写了一个类似的应用程序。当时,PGP是我的选择。我甚至不确定它是否仍然存在。

    情况1-将服务器连接到数据库

    这里没有一个简单的答案。为了连接,服务器需要密码(或对称密钥、私钥或其他任何密码)。它必须从磁盘或某些外部手段(如管理员在启动时键入)获取。添加一些间接操作,例如在主密码下加密所有敏感内容,可以增加一些便利性,但在其他方面不会改变这种情况

    通常,可以将密码或密钥放入服务器上的文件中。如果执行此操作,请确保对该文件设置权限,以便只有需要该文件的用户才能访问该文件。这是让系统上的不同进程作为不同的用户运行,并为每个进程设置单独的角色/帐户和密码的极好理由

    情形2-用户从远程计算机登录到服务器

    我想你在这里的方向是对的。听起来像什么