存储凭证? (MySQL,API等)

时间:2014-06-25 15:25:18

标签: php mysql

我使用一个小脚本来获取运行应用程序所需的凭据(MySQL数据库,第三方应用程序的API凭据等):

function get_credentials($id) {
  $env = $_SERVER['DOCUMENT_ROOT'];
  $host = '/path/to/host/www';
  $local = '/path/to/local/www';  
  if (strpos($env, $host) !== false) $source = '/path/to/host/.wwwcred';
  elseif (strpos($env, $local) !== false) $source = '/path/to/local/.wwwcred';
  $index = file_exists($source) ? json_decode(file_get_contents($source), true) : false;
  return ($index ? true : false) ? (array_key_exists($id, $index) ? $index[$id] : false) : false;
}

源(.wwwcred)是一个平面的纯文本JSON文件,存储在Web根目录之外,具有最低要求的权限。任何需要"登录"任何使用上述函数来检索凭证的东西;用户名和密码永远不会存储在任何脚本/应用程序中。

我的问题:是否有更安全的方法来完成此任务?是否有加密存储在.wwwcred中的密码的程序(并在传递之前解密)?或者是否有更好的方法来存储这类数据?

2 个答案:

答案 0 :(得分:1)

我要做的一个可能的改变是不将信用卡存储在主目录中。也许是等等的东西(也许是/etc/external/.wwwcred)。同样,为了增加另一层高程预防,我要避免使用主目录和文档根目录下的任何内容。

您已经说过您拥有最少的权限。我可能会为所有正在使用的应用创建一个组(如果它只是php,那么apache或www组应该可以工作),将文件所有者设置为root:<your group>并将权限设置为{{1 }}。如果可能的话,我会将所有标准用户排除在该组之外 - 这应该只是root用户和应用程序层应该看到的。

答案 1 :(得分:0)

nmax,不是特定于代码的,但这里是。

我想这一切都取决于你想要与安全性有多远。您可以对凭据进行哈希处理,并将它们保存在文件中,以减少数据库查询.2。它们不会在备份和转储等方面被意外传递。

如果你沿着哈希路线走下去,请记住一件事:

  • 工作因素

由于资源通常被认为是有限的,因此调整工作因素(或成本)的常用经验法则是使protect()尽可能慢地运行而不影响用户。经验并且不会增加超出预算的额外硬件需求。因此,如果注册和身份验证的案例接受保护()最多需要1秒钟,您可以调整成本,以便在硬件上运行需要1秒。这样,它不应该太慢以至于您的用户受到影响,但它也应该影响攻击者&#39;尽可能多地尝试。

尽管建议使用最少的迭代次数来确保数据安全,但随着技术的进步,这一值每年都在变化。众所周知的公司选择的迭代计数的一个例子是Apple用于其iTunes密码的10,000次迭代(使用PBKDF2)2(PDF文件)。但是,了解单个工作因素并不适合所有设计至关重要。实验很重要。[* 6]

以上也考虑:

  • 仅通过TLS传输密码
  • 密码复杂性

我还附上了一些关于密码,TLS和其他一些OWASP备忘单的链接: