如何存储数据库密码

6
我确信已经有很多讨论了,但是如何在应用程序中存储密码呢?(我的意思不是将用户密码存储在数据库的表中,而是用于构建连接字符串的密码)
我看到过类似将其加密存储在诸如xml文件之类的平面文件中,然后在运行时读取和解密。如果这个应用程序在服务器上运行,这是一个非常好的选择,但是如果该应用程序将部署到最终用户的计算机上怎么办?也就是说,平面文件将被复制到用户的计算机上。这仍然是一个好的做法吗?(我的直觉是'否')
我知道SecurityString的存在,但是我也在一篇帖子中读到过,SecurityString也很容易被攻破。
使用Windows 7附带的Password Vault是否是一个好主意?有没有利用编程实现的好例子?我在MSDN中看到了一个例子,但首先它带有“Windows 8”的标签,其次当我下载文件并在Visual Studio 2012 Express中打开解决方案时,它无法打开。
欢迎任何建议...非常感谢。
--更新--
假设应用程序将在Windows域内的一些计算机上运行。(1)在启动时,应用程序将进行LDAP身份验证(Active Directory)。只有在成功验证后,应用程序才会继续执行,并且(2)在幕后,应用程序可以连接到数据库,接受用户输入查询数据库,这就是数据库密码发挥作用以构建连接字符串的地方(不是SQL Server数据库,因此我认为使用Windows身份验证的选项不可行,除非使用商业插件)。
数据库位于同一个域中,并已设置为允许某些范围的IP地址,并启用了SSL。简而言之,在这个意义上,它是相当安全的。唯一尚未安全的部分是如何存储应用程序的数据库密码。
引起我的注意的是Mysql Workbench。它将保存数据库连接,包括密码——存储在密码保险箱中。这是mysql自己实现密码保险箱的方式,我非常好奇它是如何完成的。

你使用的是哪个数据库,它托管在哪里?它是否与客户端位于同一Windows域中? - Jodrell
我已经编辑了你的标题。请参考“问题的标题应该包含“标签”吗?”,在那里达成共识是“不应该”。 - John Saunders
2个回答

8

给用户密码并期望它保持安全是不可能的。即使它被隐藏在编译的应用程序中并使用单向哈希进行加密,有意者也能够恢复它。

相反,您应该考虑您的安全架构。

如果您提供的是应用程序连接的服务,则应考虑作为公共API一部分提供更强大的身份验证。

如果连接字符串用于连接分布式软件的另一部分,那么您应该允许最终用户对密码进行配置,并将其存储在钥匙环或其他加密存储中。

-- 更新 --

看起来这可能是您正在寻找的内容;

http://www.microsoft.com/indonesia/msdn/credmgmt.aspx


谢谢您的回复!我已经更新了我的帖子,非常欢迎您的想法。 - user1866880

5
如果应用程序将部署在您对系统安全没有或很少控制的地方,例如外部用户计算机,则创建用户登录可能是值得的。对该登录进行身份验证,然后从相对安全的服务器使用所需的凭据来提供数据。
这并不能保证安全性,但如果需要在未来某个时候更改密码或者某个用户受到威胁,这将更容易维护。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接