在Web应用程序源代码中存储密码是否安全?

时间:2009-03-05 01:07:00

标签: security

所以我有一个Web应用程序,它集成了几个需要身份验证的API和服务。我的问题是,在我的源代码中以纯文本格式存储我的身份验证凭据是否安全? 如何安全地存储这些凭据?

我认为这是一个常见问题,因此我希望看到一个解决方案,以确保答案中的凭据。

回应评论:我经常使用PHP,Java和RoR

我希望看到更多选票来回答这个问题。

11 个答案:

答案 0 :(得分:6)

以下是我们对密码的处理方式。

$db['hostname'] = 'somehost.com'
$db['port'] = 1234;

$config = array();
include '/etc/webapp/db/config.php';

$db['username'] = $config['db']['username'];
$db['password'] = $config['db']['password'];

除了webserver用户之外,没有人可以访问/etc/webapp/db/config.php,这样就可以保护开发人员的用户名和密码。

答案 1 :(得分:5)

不将PW存储在代码中的唯一原因仅仅是因为配置问题(即需要更改密码而不想重建/编译应用程序)。

但源是“安全敏感”内容(如密码,密钥,算法)的“安全”位置。当然是。

显然,需要正确保护安全敏感信息,但无论使用何种文件,这都是基本事实。无论是配置文件,注册表设置,还是.java文件或.class文件。

从架构的角度来看,出于上述原因,这是一个坏主意,就像你不应该在代码中“硬编码”任何“外部”依赖关系一样,如果你能避免它。

但敏感数据是敏感数据。将PW嵌入到源代码文件中会使该文件比其他源代码文件更敏感,如果这是您的惯例,我会认为所有源代码都与密码一样敏感。

答案 2 :(得分:2)

不推荐。

encrypted web.config将是一个更合适的地方(但不能与网络农场一起使用注释)

答案 3 :(得分:2)

看来答案如下:

  1. 不要将凭据放在源代码中,而是......
  2. 将凭据放入配置文件
  3. 清理日志文件
  4. 在configs上设置适当的权限/所有权
  5. 可能更多取决于平台...

答案 4 :(得分:1)

不,不是。

另外,您可能希望有一天更改密码,并且可能更改源代码可能不是最佳选择。

答案 5 :(得分:1)

没有。有时这是不可避免的。更好的方法是建立一个架构,服务将隐含地信任基于另一个信任的运行代码。 (例如,信任正在运行代码的计算机,或信任运行该软件的应用程序服务器)

如果这些都不可用,那么编写自己的信任机制是完全可以接受的,尽管我会将它与应用程序代码完全分开。此外,建议研究如何将密码保存在捕食者手中,即使存储在本地机器上 - 记住如果有人控制了物理机器,你就无法保护任何东西。

答案 6 :(得分:1)

如果您控制Web服务器并维护它以进行安全更新,那么在源(最好是在配置模块中)或源使用的配置文件中可能是最好的。

如果您不控制Web服务器(例如,您在托管公司提供的共享或甚至专用服务器上),那么加密对您没有多大帮助;如果应用程序可以解密给定主机上的凭据,则可以使用主机解密凭证而无需您的干预(考虑root或管理员查看源代码,并调整解密例程以使其可以用来读取配置)。如果您使用未经模糊处理的托管代码(例如,JVM或.NET)或驻留在服务器上的纯文本(如PHP)中的Web脚本语言,则更有可能。

通常情况下,安全性和可访问性之间存在权衡。我会考虑你正在努力防范的威胁,并提出一种方法来防范你需要的情况。如果您正在处理需要安全的数据,那么您可能应该定期编辑数据库并将数据脱机到一个防火墙且受到良好保护的数据库服务器,一旦它在网站上变得陈旧。这将包括可以参考的社会安全号码,账单信息等数据。这也意味着您理想地希望控制自己网络上提供计费服务或安全数据存储的服务器。

答案 7 :(得分:1)

我更喜欢将它们保存在一个单独的配置文件中,该文件位于Web服务器文档根目录之外的某个位置。

虽然这不能防止攻击者以强制告诉他们密码的方式破坏我的代码,但它仍然比将密码直接放入代码(或任何其他网站)更有优势。可访问文件)因为它消除了对Web服务器错误配置(或错误/漏洞利用)的担忧,允许攻击者直接下载包含密码的文件。

答案 8 :(得分:0)

我正在为接收密码而非客户端的网络服务应用编写此代码: 如果您在源代码中保存哈希密码,那么查看源代码的人将无法使用该哈希来帮助自己。 您的程序将接收普通密码并将其哈希并比较两个哈希值。 这就是为什么我们将散列密码保存到数据库中,而不是纯文本。因为如果某人例如窃取数据库或将其视为恶意目的,他们就无法撤销,他将不会获得所有用户的密码,只有对他来说无用的哈希。

散列是单向过程:它从相同的源生成相同的值,但您无法从散列中计算源值。

存储在客户端上:当用户输入pass时,你将它以明文形式保存到db / file,可能会混淆一点,但是你可以做的很少,以防止有人拿到那台计算机来获取密码。

答案 9 :(得分:-1)

一种方法是在将密码放入config.web

之前加密密码

答案 10 :(得分:-3)

似乎没有人提到哈希 - 使用强哈希算法(即SHA-2而非MD5),它应该更加安全。