我确信已经有很多讨论,但如何在应用程序中存储密码? (我的意思不是存储在数据库中的表中的用户密码,而是用于构建连接字符串的密码)
我已经看过一些建议,比如将它存储在一个平面文件(例如xml文件)中,然后读取它并在运行时解密它。如果此应用程序在服务器上运行,这是一个非常好的选择,但是如果将应用程序部署到最终用户的PC上该怎么办?即平面文件将被复制到用户的电脑上。这仍然是一个好习惯吗? (我的直觉是'不')
我知道SecurityString的存在,但后来我也在一篇文章中读到SecurityString也很容易被解读。
使用Windows 7附带的密码存储库是个好主意吗?有没有以编程方式使用它的好例子?我在msdn中看到过一个例子,但首先它标有'windows 8',其次当我下载文件并在visual studio 2012 EXPRESS中打开解决方案时,它无法打开。
欢迎任何建议......非常感谢。
- 更新 -
假设应用程序将在Windows域中的少数几台PC上运行。 (1)启动时,应用程序将执行LDAP身份验证(活动目录)。只有在成功认证后,应用程序才会继续,并且(2)在应用程序可以连接到数据库的场景后面,用户输入来查询数据库,这就是db passwd进入游戏构建连接字符串的地方(不,这不是SQL SERVER数据库,所以我不认为使用Windows身份验证的选项是可行的,除非使用商业插件。)
db驻留在同一个域中,并且已设置为允许某些范围的IP地址,并且已启用SSL。简而言之,从这个意义上讲它是非常安全的。唯一尚不安全的是如何为应用程序存储db passwd。
引起我注意的是Mysql Workbench。它将保存数据库连接,包括密码 - 存储在密码保险库中。这是mysql自己的密码保险库实现,我很好奇它是如何完成的。
答案 0 :(得分:8)
无法为用户提供密码并希望其保持安全。即使它隐藏在已编译的应用程序中并使用单向散列进行散列,确定的也将恢复它。
相反,您应该考虑您的安全架构。
如果您提供应用程序连接的服务,那么您应该考虑在公共API中提供某种更强大的身份验证。
如果连接字符串用于连接分布式软件的其他部分,则应该由最终用户配置密码并将其存储在密钥环或其他加密存储中。
- 更新 -
看起来这可能就是你要找的东西;
答案 1 :(得分:5)
如果要部署的应用程序没有或几乎没有对系统安全性的控制,即外部用户PC,那么创建用户登录可能是值得的。根据此登录对用户进行身份验证,然后从相对安全的服务器使用您提供数据所需的任何凭据。
这并不能保证安全性,但如果您需要在将来的某个时间更改密码,或者个人用户遭到入侵,则会更容易维护。