保护数据库密码


18

查看我所见过的大多数基于PHP / MySQL的网站的结构,似乎很难辨别数据库密码,因为您一定会在某个地方存储设置或配置文件以进行日志记录进入数据库。除了确保对远程请求适当限制数据库特权的基本预防措施之外,我可以在自己的项目中实现哪些可用选项来保护此信息?


1
澄清一下-您是在问有关存储从网站登录数据库的凭据,而不是如何在数据库中正确存储网站用户的密码,对吗?

正确; 这就是我要说的。
Kaji

Answers:


10

这不是有关密码存储的直接答案,但是在构建Web应用程序时,我通常至少使用两个数据库连接-一个用户有99%的时间用于与用户相关的活动,具有受限权限,而另一个则用于“管理员”功能(删除用户等)。

在少数情况下,如果要安装其他人的软件包,我将安装两个实例:一个面向公众的实例,该实例仅具有数据库访问权限才能执行常规的用户类型的操作,而另一个实例的IP受IP限制我的本地子网(甚至可能在其他计算机上),该子网必须用于任何“管理员”类型的活动。但是,两个人都无权访问修改表等……我宁愿通过本机数据库工具进入,也不愿让Webapp运行自己的未经审核的更新任务。

但是,您甚至可以更进一步,并为给定的任务添加更多的连接...因此,用户创建和密码管理任务将通过对用户表具有额外特权的用户进行,登录时具有要验证的数据库特权,而无需进行其他操作等

这样,如果发生了sql注入攻击,则在大多数网页上它实际上并不能做任何重要的事情-无法看到密码哈希,无法添加新的管理员用户(不是他们能够做到)无论如何),等等。如果他们设法在您的计算机上安装Shell仍然无济于事,但这会使它们变慢。


1
我们做类似的事情。但是,我们通常为数据库的每个用户/应用程序创建一个新帐户,而不是按功能进行操作。这为我们解决了两个问题-1)我们可以在OEM等工具中区分数据库的使用(即,我们可以看到谁在对数据库进行细化处理),以及2)我们可以分别调整每个用户在数据库中看到和可以访问的内容数据库。
ScottCher 2011年


4

我非常喜欢在可能的情况下通过本地套接字使用PostgreSQL的'Ident'身份验证。这样,本地用户将直接映射到本地计算机的Unix / Windows用户,而我完全不必担心存储密码。不过,我认为这不是MySQL中的选项。

在数据库和Web服务器位于两台不同的机器上的情况下,我使用SSL上的MD5密码:如果敌对者可以访问我的前端服务器,那么他弄清楚它与数据库的通信方式只是时间问题。


3

如果您使用的是.NET Framework,则可以研究使用加密的连接字符串。我不知道在其他任何语言/框架中是否可能出现这种情况,但这将是确保您的连接不会受到损害的另一种保护措施。

除了使用加密的连接字符串之外,使用LDAP / Kerberos / Active Directory将是最安全的选择。


3

如果您的密码以纯文本格式存储,请使用哈希(MD5,SHA),Luke!


OP并未询问有关存储用户密码的问题。但是,是的,当然可以对用户密码进行哈希处理,但是千万不要使用MD5或SHA系列用户来这样做!使用bcrypt或PBKDF2。否则,您很快就会在新闻中发现自己例如这些使用MD5和SHA1的公司,从而使他们的用户遭受简单的暴力攻击。
Nick Chammas 2012年

当然,除了哈希之外,还需要盐腌和其他技术。而且永远不要自己(自己)实现加密基元,而应该使用一些经过广泛测试的加密库。
Yasir Arsanukaev 2012年

2

根据您的编程语言,您可以对登录凭据进行加密,但是如果您运行的是解释语言,则无法确保有人获得对系统的访问权限后就无法弄清凭据。

如果您正在运行C ++或类似的程序,那么我建议您创建/查找一个加盐的加密/解密函数,并通过该函数运行凭据,并将生成的哈希存储为文件在系统上。

如果您正在运行PHP或类似的程序,我建议您为编写包装,mcrypt_encrypt()并对凭据加盐,然后运行一些代码混淆,以防万一黑客获得了对系统的访问权。


如果您对凭据进行加密,则需要其他秘密来再次对其进行解密。或者,加密形式成为机密,因此攻击者可以使用它。缺少一些细节。
Peter Eisentraut 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.