Php 如何安全地存储密码,使其';应用程序仍然可以读取re吗?

Php 如何安全地存储密码,使其';应用程序仍然可以读取re吗?,php,mysql,encryption,passwords,password-encryption,Php,Mysql,Encryption,Passwords,Password Encryption,我有一个应用程序,它使用用户对另一个网站的凭据从该网站获取信息。问题是,为了让它工作,我的应用程序必须知道用户的实际用户名/密码 我试图想出一些方法来安全地存储他们的密码,总是加密的,但我的应用程序需要能够读取它们。它们将存储在MySQL数据库中 我主要关心的是要有足够安全的东西,如果数据库遭到破坏,黑客将无法读取/解码用户/密码信息 我在搜索公司如何存储信用卡信息,我会从那里开始,但我找不到足够清楚的解释 怎么做的?我该怎么做 谢谢。您不能使用哈希,因为它是单向的。也许加密(AES,也许???

我有一个应用程序,它使用用户对另一个网站的凭据从该网站获取信息。问题是,为了让它工作,我的应用程序必须知道用户的实际用户名/密码

我试图想出一些方法来安全地存储他们的密码,总是加密的,但我的应用程序需要能够读取它们。它们将存储在MySQL数据库中

我主要关心的是要有足够安全的东西,如果数据库遭到破坏,黑客将无法读取/解码用户/密码信息

我在搜索公司如何存储信用卡信息,我会从那里开始,但我找不到足够清楚的解释

怎么做的?我该怎么做


谢谢。

您不能使用哈希,因为它是单向的。也许加密(AES,也许???)就是你要找的。在写入mysql之前,它们会被加密。

您要做的是在数据库中存储密码时对其进行哈希运算。当用户尝试登录时,您的应用程序将对他们提供的密码进行哈希运算,然后检查数据库中是否有匹配的用户名/哈希密码对

我建议定义一个函数,让您以一致的方式散列密码:

<?php

function hashPWD($in) {
  $out = $in;
  for($i = 0; $i < 1000; $i++) {
    $out = hash('sha256', $out);
  }
  return $out;
}

您需要创建mysql\u查询字符串,以便将输入的密码插入数据库。下面,我用一个函数来实现这一点。您必须将数据库中的用户表定义为“用户”,此代码才能工作。我使用散列函数进行加密

$register_data = array(
'password'  => $_POST['password']
// Add other user stuff here, e.g. 'username' => $_POST['username']
);
function register_user($register_data) {
array_walk($register_data, 'array_sanitize');
$register_data['password'] = hash($register_data['password']);
$fields = '`' . implode('`, `', array_keys($register_data)) . '`';
$data = '\'' . implode('\', \'', $register_data) . '\'';
mysql_query("INSERT INTO `users` ($fields) VALUES ($data)");
    }
现在,转到密码表单

<form>
<label>Enter your password!</label>
<input type="type" name="password">

输入您的密码!
注意如何将输入定义为密码。
这对于注册脚本应该很有效。

好吧,我想我有个坏消息:

如果你的应用程序必须知道用户的用户名和明文密码,这样你才能登录到其他服务,那么可能没有真正安全的解决方案

您可以将它们存储为明文,这显然是不好的。 这里的积极因素:这显然是坏的,而不是隐藏的坏

您可以对它们进行加密并存储密文。但是:当您的服务需要明文时,您必须在服务器上以某种方式提供密钥才能解密密文,这并不比明文好多少,因为有人入侵您的服务器也可能获得加密密钥

如果您可以在一个特殊的解决方案上投入一些精力,可能像TPM或加密智能卡这样的特殊加密硬件会有所帮助,因为这种东西是为安全的密钥存储而设计的,因此有人闯入您的服务器可能无法读取密钥。但是:与你的应用程序使用该硬件解密内容的方式相同,如果攻击者是你服务器上的root用户,他可能也会这样做

也就是说,您可以做的是使服务/服务器在所有其他方面都尽可能安全(如通用系统、网络和web安全、具有良好的软件开发实践等)


此外,您还应该告诉用户,为了给他们提供该功能,除了以不太安全的方式存储他们的密码之外,没有其他方法。当然,他们需要在任何地方使用不同的密码。

使用散列。md5()内置于php中,因此将md5存储在数据库中,然后将登录尝试的md5与that@RedAlert,我的用户应该在我的应用程序上“保存”他们的密码一次。因此,将不会有密码与MD5哈希进行比较,因为它们不会多次登录。在他们保存密码后,我的应用程序必须能够从数据库中读取密码,但是我正在寻找一些方法来保护密码,而不是将密码以明文形式保存在数据库中。我建议使用比
md5
更强大的工具来建立@RedAlert的建议,我建议。我认为密码散列不起作用,因为用户不会每次都输入密码,所以不会有任何密码可供比较。(这是一种方法)。虽然我同意散列密码是一种方法,但我想说,使用“自己的”散列函数并不是一种最佳做法。即使你对某个东西进行了上千次的哈希运算,它仍然很容易被破坏。请看。我建议使用知名的图书馆,比如@DickW:That's fair;此外,如果询问者使用的是PHP5.5,那么它似乎是可用的。是的,PHP5.5本身甚至有一个。好东西。(@DickW:如果你想编辑我的答案,请随意编辑;我已将其标记为CW)你没有阅读/完全理解这个问题。OP说他需要用户的明文密码才能登录到另一个服务。这行不通。密码用于外部站点,而不是他自己的站点,因此存储散列是无用的