Answers:
这不是有关密码存储的直接答案,但是在构建Web应用程序时,我通常至少使用两个数据库连接-一个用户有99%的时间用于与用户相关的活动,具有受限权限,而另一个则用于“管理员”功能(删除用户等)。
在少数情况下,如果要安装其他人的软件包,我将安装两个实例:一个面向公众的实例,该实例仅具有数据库访问权限才能执行常规的用户类型的操作,而另一个实例的IP受IP限制我的本地子网(甚至可能在其他计算机上),该子网必须用于任何“管理员”类型的活动。但是,两个人都无权访问修改表等……我宁愿通过本机数据库工具进入,也不愿让Webapp运行自己的未经审核的更新任务。
但是,您甚至可以更进一步,并为给定的任务添加更多的连接...因此,用户创建和密码管理任务将通过对用户表具有额外特权的用户进行,登录时具有要验证的数据库特权,而无需进行其他操作等
这样,如果发生了sql注入攻击,则在大多数网页上它实际上并不能做任何重要的事情-无法看到密码哈希,无法添加新的管理员用户(不是他们能够做到)无论如何),等等。如果他们设法在您的计算机上安装Shell仍然无济于事,但这会使它们变慢。
我非常喜欢在可能的情况下通过本地套接字使用PostgreSQL的'Ident'身份验证。这样,本地用户将直接映射到本地计算机的Unix / Windows用户,而我完全不必担心存储密码。不过,我认为这不是MySQL中的选项。
在数据库和Web服务器位于两台不同的机器上的情况下,我使用SSL上的MD5密码:如果敌对者可以访问我的前端服务器,那么他弄清楚它与数据库的通信方式只是时间问题。
如果您使用的是.NET Framework,则可以研究使用加密的连接字符串。我不知道在其他任何语言/框架中是否可能出现这种情况,但这将是确保您的连接不会受到损害的另一种保护措施。
除了使用加密的连接字符串之外,使用LDAP / Kerberos / Active Directory将是最安全的选择。
如果您的密码以纯文本格式存储,请使用哈希(MD5,SHA),Luke!
根据您的编程语言,您可以对登录凭据进行加密,但是如果您运行的是解释语言,则无法确保有人获得对系统的访问权限后就无法弄清凭据。
如果您正在运行C ++或类似的程序,那么我建议您创建/查找一个加盐的加密/解密函数,并通过该函数运行凭据,并将生成的哈希存储为文件在系统上。
如果您正在运行PHP或类似的程序,我建议您为编写包装,mcrypt_encrypt()
并对凭据加盐,然后运行一些代码混淆,以防万一黑客获得了对系统的访问权。