Kaji Asked: 2011-01-04 19:44:05 +0800 CST2011-01-04 19:44:05 +0800 CST 2011-01-04 19:44:05 +0800 CST 保护数据库密码 772 看看我见过的大多数基于 PHP/MySQL 的网站的结构,如果你稍微挖掘一下,似乎并不难辨别数据库密码,因为总是有一个设置或配置文件存储日志信息进入数据库。除了确保我的数据库的权限针对远程请求受到适当限制的基本预防措施外,我可以在自己的项目中实施哪些选项来保护这些信息? mysql security 6 个回答 Voted Best Answer Joe 2011-01-04T20:35:05+08:002011-01-04T20:35:05+08:00 不是关于密码存储的直接答案,但我通常在构建网络应用程序时至少使用两个数据库连接——一个 99% 的时间用于与用户相关的活动,具有受限的权限,另一个用于“管理”功能(删除用户等)。 在少数情况下,当我安装其他人的包时,我会安装两个实例……一个面向公众的实例,它只有数据库访问权限来执行一般用户类型的事情,第二个实例是 IP 限制的我的本地子网(甚至可能在不同的机器上)必须用于任何“管理员”类型的活动。但是,没有人有权修改表等......我宁愿通过本机数据库工具进入,也不愿让 webapp 运行自己的未经审查的更新任务。 不过,您可以更进一步,并专门为给定任务添加更多连接...因此用户创建和密码管理任务通过对用户表具有额外特权的用户进行,登录具有数据库特权进行身份验证而不是其他, ETC。 这样,如果存在 sql 注入攻击,在大多数网页上它实际上不能做任何重要的事情——看不到密码哈希值,不能添加新的管理员用户(不是他们能做的)任何东西)等等。如果他们设法在你的机器上获得一个 shell 仍然无济于事,但它会减慢他们的速度。 YasirA 2011-01-04T19:52:14+08:002011-01-04T19:52:14+08:00 使用一次性密码、Kerberos、LDAP或其他任何方式来存储您的帐户数据并验证/授权用户。目录服务是存储用户信息并将其用作帐户数据后端的好方法。 Gaurav 2011-01-04T20:00:15+08:002011-01-04T20:00:15+08:00 只要有可能,我就非常喜欢通过本地套接字使用PostgreSQL 的“Ident”身份验证。这样,本地用户就直接映射到本地计算机的 Unix/Windows 用户,我根本不用担心存储密码的问题。不过,我认为这还不是 MySQL 中的一个选项。 数据库和网络服务器位于两台不同的机器上,我通过 SSL 使用 MD5 密码:如果敌对者可以访问我的前端服务器,那么他迟早会弄清楚它是如何与数据库通信的。 YasirA 2011-01-04T19:46:22+08:002011-01-04T19:46:22+08:00 如果您的密码以纯文本形式存储,请使用哈希值(MD5、SHA),卢克! Jeremiah Peschka 2011-01-04T20:41:32+08:002011-01-04T20:41:32+08:00 如果您使用的是 .NET Framework,则可以考虑使用加密的连接字符串。我不知道这样的事情在任何其他语言/框架中是否可行,但这将是确保您的连接不受损害的另一种保护措施。 除了使用加密的连接字符串之外,使用 LDAP/Kerberos/Active Directory 将是您最安全的选择。 Patrick 2011-01-04T19:57:10+08:002011-01-04T19:57:10+08:00 根据您的编程语言,您可以加密登录凭据,但如果您运行的是解释型语言,则无法确保有人在获得系统访问权限时无法弄清楚凭据。 如果你正在运行 C++ 或类似的,那么我建议你创建/找到一个加盐的加密/解密函数并通过它运行凭据并将生成的哈希作为文件存储在系统上。 如果您正在运行 PHP 或类似的程序,我建议您为 编写一个包装器mcrypt_encrypt()并加盐凭据,然后运行一些代码混淆以减慢任何黑客的速度,如果他们确实获得了对系统的访问权限。
不是关于密码存储的直接答案,但我通常在构建网络应用程序时至少使用两个数据库连接——一个 99% 的时间用于与用户相关的活动,具有受限的权限,另一个用于“管理”功能(删除用户等)。
在少数情况下,当我安装其他人的包时,我会安装两个实例……一个面向公众的实例,它只有数据库访问权限来执行一般用户类型的事情,第二个实例是 IP 限制的我的本地子网(甚至可能在不同的机器上)必须用于任何“管理员”类型的活动。但是,没有人有权修改表等......我宁愿通过本机数据库工具进入,也不愿让 webapp 运行自己的未经审查的更新任务。
不过,您可以更进一步,并专门为给定任务添加更多连接...因此用户创建和密码管理任务通过对用户表具有额外特权的用户进行,登录具有数据库特权进行身份验证而不是其他, ETC。
这样,如果存在 sql 注入攻击,在大多数网页上它实际上不能做任何重要的事情——看不到密码哈希值,不能添加新的管理员用户(不是他们能做的)任何东西)等等。如果他们设法在你的机器上获得一个 shell 仍然无济于事,但它会减慢他们的速度。
使用一次性密码、Kerberos、LDAP或其他任何方式来存储您的帐户数据并验证/授权用户。目录服务是存储用户信息并将其用作帐户数据后端的好方法。
只要有可能,我就非常喜欢通过本地套接字使用PostgreSQL 的“Ident”身份验证。这样,本地用户就直接映射到本地计算机的 Unix/Windows 用户,我根本不用担心存储密码的问题。不过,我认为这还不是 MySQL 中的一个选项。
数据库和网络服务器位于两台不同的机器上,我通过 SSL 使用 MD5 密码:如果敌对者可以访问我的前端服务器,那么他迟早会弄清楚它是如何与数据库通信的。
如果您的密码以纯文本形式存储,请使用哈希值(MD5、SHA),卢克!
如果您使用的是 .NET Framework,则可以考虑使用加密的连接字符串。我不知道这样的事情在任何其他语言/框架中是否可行,但这将是确保您的连接不受损害的另一种保护措施。
除了使用加密的连接字符串之外,使用 LDAP/Kerberos/Active Directory 将是您最安全的选择。
根据您的编程语言,您可以加密登录凭据,但如果您运行的是解释型语言,则无法确保有人在获得系统访问权限时无法弄清楚凭据。
如果你正在运行 C++ 或类似的,那么我建议你创建/找到一个加盐的加密/解密函数并通过它运行凭据并将生成的哈希作为文件存储在系统上。
如果您正在运行 PHP 或类似的程序,我建议您为 编写一个包装器
mcrypt_encrypt()
并加盐凭据,然后运行一些代码混淆以减慢任何黑客的速度,如果他们确实获得了对系统的访问权限。