2012-01-06 128 views
0

我正在开发一个简单的iPhone应用程序,用户注册并使用其电子邮件/密码登录。这些值存储在远程数据库中。在iPhone应用程序中安全地存储远程数据库凭证

我正在使用Cloudant存储这些信息(CouchDB很棒),并且已经为新用户授予了只读权限(创建的API密钥/密码)。为了与Cloudant进行通信,您显然需要一个URL来访问它(例如https://user:[email protected]),它以字符串形式存储在应用程序中。

现在,虽然我知道这是非常不安全的,但为了保持数据库URL安全(特别是它的用户名/密码),我无法想到其他任何替代方法。我已经看到有人谈论使用另一台服务器代理以获取凭据,但它似乎有点尴尬。

任何帮助或想法将非常感激!

回答

1

您是否试图从iPhone应用程序直接连接到数据库?您不应该让您的应用程序读取整个远程用户表/数据库。迟早有人会发现并将阅读您的数据。无论您如何尝试对其进行混淆,用户/密码组合都需要以某种方式存储在您的应用中。

你应该做的是构建一个连接到你的数据库并验证你的用户的Web服务。数据库密码保留在服务器上。这种代理方式并不笨拙,它是让数据库登录远离用户的唯​​一方法。

+0

这就是我认为会是这样的情况。我的意思是在添加另一个具有Web服务的层(另一个服务器)方面很笨拙。但是,如果这是它必须的方式(和其他人做同样的事情),那很好!我更喜欢最佳实践方法,欢呼! – crawf 2012-01-07 00:08:36

+0

是的,在这种情况下的最佳做法是抽象存储(数据库)。网络服务只会回答“用户/合格组合正确”或“无效登录”到您的应用程序。在这方面,它不是一个真正的代理服务器,把它想象成一个你可以通过HTTP访问的服务器功能;) – shapecatcher 2012-01-07 00:36:45

+0

听起来不错!尽管Web服务的URL仍然位于应用程序内部,并且用户凭证将通过POST发送。它比直接访问数据库要好。感谢您的洞察! – crawf 2012-01-07 00:44:35

1

一种选择是在云中创建自己的服务,将您的存储抽象化。这也有利于您在不更新所有设备的情况下更改存储空间。

在该模型中,服务存储凭据以访问存储,并在应用程序层实现用户安全性。我也不会认为它是一个代理层 - 这意味着它是一个很薄的通道。如果您开发一项服务,您应该定义一个与存储无关的Web界面(休息,肥皂)。在这种情况下,这是一种服务,而不是代理。

编辑:

通常情况下,网络服务认证用户(不写你自己的)。具有SSL的基本身份验证是典型的。然后,在该服务上下文API中,您可以访问用户名。从那里开始,你就是你所需要的。您的存储空间可以通过一个可以完全访问所有内容的存储帐户访问。

另一个auth选项是OAuth,它允许他们像谷歌这样的人进行身份验证 - 你永远不会得到密码 - 只是一个来自谷歌的令牌,让你知道他们的身份验证,他们是他们自称的人。例如,这就是堆栈溢出的工作原理。

+0

因此,如果我有这个权利...对于一个典型的用户登录,他们会输入他们的电子邮件/密码,这是发送到服务器设置的服务。从那里开始,它将与CloudAnt进行通信以验证其登录信息,该信息会将请求返回给服务,然后返回到应用程序。不过,这意味着云服务URL将需要存储在应用程序中。什么是阻止某人直接访问该URL? – crawf 2012-01-07 00:14:46

+0

通常,Web服务对用户进行身份验证(不要自己写)。具有SSL的基本身份验证是典型的。然后,在该服务上下文API中,您可以访问用户名。从那里开始,你就是你所需要的。您的存储空间可以通过一个可以完全访问所有内容的存储帐户访问。 – bryanmac 2012-01-07 12:46:41

+0

另一个auth选项是OAuth,它允许他们像谷歌这样的人进行身份验证 - 你永远不会得到密码 - 只是一个来自谷歌的令牌,让你知道他们的身份验证,他们是他们自称的人。例如,这就是堆栈溢出的工作原理。 – bryanmac 2012-01-07 12:48:36

相关问题