2010-06-14 85 views
3

我的web应用程序存储外部网站登录/密码以便与他们进行交互。要与这些网站进行交互,我需要使用原始密码文本,因此仅将哈希存储在我的数据库中不起作用。存储原始密码文本

我应该如何存储这些密码?

编辑: 我担心是否有人访问我的服务器。如果我使用某种双向加密并且他们有服务器访问权限,那么他们可以检查密码在后端代码中的解密方式。

回答

3

在我看来,你想以类似于Firefox和Chrome的方式存储密码。那么为什么不看他们如何做呢?

这是Chrome浏览器如何做的: http://www.switchonthecode.com/tutorials/how-google-chrome-stores-passwords

+0

有趣的部分是在最后:“CryptProtectData,它是一个Windows API函数,用于加密数据。[...]它只能在同一台机器上和同一用户解密......”它不告诉我们加密是如何工作的,或者其他平台有什么替代方案,所以我不确定它是否直接适用。 – 2010-06-14 13:51:46

3

如果你必须这样做,你应该使用双向加密。这里有很多算法(密码),但基本上用加密密钥加密数据,并使用相同的密钥再次解密。

选择合适的加密取决于由你选择的编程语言的支持,但它的实例是:

  • 河豚
  • 3DES

他们有不同的复杂性和一些比其他人更难以破解。但是,您应该认识到,如果有足够的时间,双向加密不会受到破解的威胁。所以这一切都取决于这些密码有多敏感。

/Carsten

+0

好的,但你在哪里存储加密密钥?对我来说,就像你刚把问题搬到另一个地方一样。 – 2010-06-14 04:44:44

+0

这就是我所担心的 - 如果有人可以访问我的服务器,那么他们可以计算出原始密码,不管它们是否加密。 – hoju 2010-06-14 05:55:55

+0

@Mike:同意。但根据理查德的设置,数据库数据可能比文件系统更容易(从破解者的角度来看)访问。所以我们所有的答案都取决于理查德想要消除什么样的威胁。 – 2010-06-14 06:07:49

3

确定您正在保护他们的是什么。选项包括(但不限于):意外泄露,您的披露,传输中的披露,由于代码错误引起的披露,由于硬件的物理盗窃而导致的披露等。

如果这是一个Web应用程序,用户正在存储他/她自己的一组密码,那么您可以使用他们的登录密码将这些密码加密到您的应用程序中。如果这是每个用户单独安装的应用程序,并且它保留自己的本地数据库,那么您可以拥有一个可选的主密码(如Firefox)。

如果您只是在硬件被盗时确保数据安全,则可以使用像TrueCrypt或PGP WDE或Ubuntu,Debian或Fedora内置方法的全盘加密解决方案,并且需要PIN码或每次启动时输入密码。

如果您只关心安全传输,请确保您使用传输安全性的代码,并且不必担心加密数据库中的数据。

+0

是的,它是一个Web应用程序,我担心有人能够访问数据库和后端代码可读的服务器 – hoju 2010-06-14 06:01:36

+0

因此,使用用户的登录密码或其衍生作为密钥对数据库中的密码进行加密(对称) (例如,secure_hash(constant_server_secret + user_password)) 只有当它们的会话处于活动状态时,才会将该密钥保存在内存中,并在会话过期或注销时将其丢弃。不要发送给用户;他们不在乎,而且暴露了关键。 攻击者(甚至你自己)可以访问的唯一密码是具有活动会话的用户的密码,然后只是仔细查看当前内存状态。 – Slartibartfast 2010-06-15 03:26:44

3

我会去这个以下列方式。

对硬件保护数据被窃取:

使用光盘加密在以前的文章中讨论。

保护数据,如果服务器被攻破(黑客攻击):

我会用两个不同的服务器为这个项目,一名工人服务器和一个前服务器。

A)工人服务器

  • 这与密码等, 还连接到其他服务时DB。
  • 要连接到工作服务器,用户可以 通过API做到这一点。 API应该 对功能,insertUserData, 它允许用户数据被插入, API躲过所有的输入。
  • API使用 其中只有输入的用户数据表 privilegies一个DB用户。
  • 这将是联系 此服务器的唯一途径。
  • 只允许SSL 连接。
  • 该服务器反过来运行连接到外部服务的chron作业,从中提取数据并填充数据库。使用具有不同用户权限的不同数据库。
  • 该服务器运行另一个连接到前端服务器的chron JOB,并将新数据推送到前端服务器。
  • 从您的IP运行
  • 只有SSH/SCP服务的最小量,严密的防火墙。如果连接断开X /分钟等,它们只会偶尔插入。
  • NO FTP等

B)前服务器

从工人服务器接收数据,从不使用密码本身。只有联系工作服务器的方法是通过上面提到的API,仅用于新用户信息。这是所有用户登录查看他们的信息的地方等。

在同一台服务器上这样做的问题,如果你被黑客入侵,黑客可以坐下来嗅探所有传入的数据/密码等等。所以即使他们存储/加密/解密安全,有一定的耐心,他会闻所有。

+0

我知道如果一个黑客能够访问工作服务器,你就会被搞砸了,但这会让它变得几乎不可能。您还可以添加工作服务器上的API依次调用存储过程。 – grandnasty 2010-06-14 13:21:09

1

当应用程序第一次运行时,它会生成一个随机密钥。该密钥将用于加密和解密敏感数据。将密钥存储在本地文件中,并设置文件权限,以便其他人无法读取它。确保运行Web服务器的用户没有登录访问权限(无论如何,这是个好主意)。

可能的方式来打破这个系统:

  1. 获得root权限。
  2. 获取sudo访问权限。
  3. 在Web服务器上部署恶意应用程序 - 此应用程序将有权访问该密钥,并可能能够将其发送到其他位置。

只要你对所有这些采取合理的预防措施,你应该没问题。


编辑:试想想起来了,你可以只直接存储在密钥文件中的敏感数据。加密会提供额外的安全层,但它不会是一个非常强大的层;如果攻击者可以访问该文件,那么他也有权访问数据库。