0

我目前正在完成我的应用程序的安全性。

我要问各位专家的一个问题是,是否有办法让某人控制我的 unix 平台,从某种 mysql 日志中提取密码?

我通常在 php 和 mysql 之间传输密码是这样完成的:

$sql = "CALL client_create(?, ...)";
$stmt = $cnx->prepare($sql);
$stmt->execute(array($hashpw, ...));
$cnx->commit();

我的设置中没有autocommit,如果这改变了任何东西。

所以基本上必须有某种重做日志或类似的,对吧?那怎么办,应该担心吗?我应该偶尔冲洗一次吗?

谢谢您的帮助!

4

1 回答 1

2

你害怕的事情是绝对可能的。但是,这不应该是一个真正的问题。让我解释:

MySQL 当前使用许多不同类型的日志:

  1. 二进制日志- 这些用于复制并将每个写入查询写入它(以可逆二进制形式)。如果要进行复制,则需要这些日志。
  2. 查询日志- 这些用于调试(通常)。它们通常不会在生产环境中启用(应该禁用)。
  3. InnoDB 事务日志- 这用于每次写入以允许事务符合 ACID(详细信息超出此答案的范围)。
  4. 其他日志- 在这里您无需担心(错误日志、慢查询日志等)。

因此,数据通常至少写入一个日志文件,但也可能写入 3 个(取决于服务器配置)。

但它也被写入磁盘。它以合理的纯文本格式存储在表空间中。因此,如果我(作为攻击者)可以访问磁盘,我将跳过日志并直接获取表信息本身。

现在,如果您在数据库层中“散列”密码(意味着纯文本密码进入查询,并且数据库发出散列函数),那么您是正确的,日志可能会产生纯文本密码.

这不值得

尝试通过刷新日志来隐藏此信息是不值得的。最好从源头解决问题(在您的应用程序中使用更好的散列方法)。

问题是 MySQL 使用的任何散列都是简单的原始散列(例如MD5()or SHA256())。两者都设计得很快。因此,如果我可以从表中获取哈希值,我几乎可以像使用原始密码一样轻松地攻击它。为什么?因为快速哈希很容易使用 GPU进行暴力破解。

TLDR

基本上,你必须做两件事(至少从我的角度来看):

  1. 阻止人们访问数据库的文件系统。这是首要的。
  2. 使用正确的密码存储技术(bcrypt 等)。这将减轻日志文件可能构成的任何向量。
于 2013-03-15T17:18:57.860 回答