如何以一种应用程序仍可读取的方式安全地存储密码?

时间:2014-01-28 00:32:41

标签: php mysql encryption passwords password-encryption

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

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

我主要担心的是有足够的安全性,如果数据库受到损害,黑客将无法读取/解码用户/密码信息。

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

怎么做?我该怎么做?

感谢。

4 个答案:

答案 0 :(得分:1)

你不能使用哈希,因为它是一种方式。也许加密(AES,也许??)是你正在寻找的。它们在写入mysql之前会被加密。

答案 1 :(得分:1)

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

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

<?php

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

自从您提到应用程序以来,另一个想法是在用户成功登录时生成某种会话标识符(基于凭据,时间戳和设备的任何标识信息)。在成功登录尝试时,您将写入会话表,并且您的前端与后端进行的任何事务都会发送该会话标识符以及设备信息。

答案 2 :(得分:0)

好吧,猜猜我有坏消息:

如果没有其他方式,您的应用程序必须知道用户的用户名和明文密码,以便您可以登录到其他服务,可能没有真正安全的解决方案。

你可以将它们存储为明文,这显然很糟糕。 这里是积极的:它显然很糟糕,而不是很难过。

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

如果您可以在特殊解决方案上投入一些精力,可能需要特殊的加密硬件(如TPM或加密智能卡),因为这些内容是为安全密钥存储而设计的,因此有人闯入您的服务器可能无法读出钥匙。但是:就像你的应用程序使用该硬件解密内容的方式一样,如果攻击者是你服务器上的root用户,攻击者也可能会这样做。

它说,你可以做的是使服务/服务器像其他所有方式一样安全(如一般系统,网络和网络安全,具有良好的软件开发实践等)。

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

答案 3 :(得分:-1)

您需要创建mysql_query字符串,以便将输入的密码插入数据库。下面,我用一个函数来做这个。您必须在数据库中将用户表定义为“用户”才能使此代码正常工作。我使用哈希函数进行加密。

$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">

注意输入是如何定义为密码的。 这应该适用于寄存器脚本。