2009-08-24 148 views
0

我正在创建一个Web服务以允许应用程序开发人员(A.K.A.我的朋友)查询我的数据库。事情是,作为一个安全约束,我希望能够跟踪每个用户。我正在创建FaceBook或Google地图等独特应用程序ID。独特的应用程序密钥

开发人员必须提交用户名和电子邮件地址,当他们点击生成一个唯一的密钥将被生成。问题是,如果用户/电子邮件已存在,则必须先检查数据库,并检查密钥是否已生成(伪随机生成保护)。

要使用Web服务的用户必须输入类似:

webservice.Authenticate(“在这里应用的关键”);

进行验证。提前致谢。

+0

我在看GUID的一代。它真的是独一无二的吗?还是它是一个随机数? – ferronrsmith

+0

你到底需要什么帮助?这听起来像你有一个很好的计划... –

+1

GUID几乎是真正独特的。好的,所以你可能会碰到一个冲突,但是这个机会很小,它真的不值得考虑,如果你担心冲突,尝试再创建一个Guid,然后再试一次(如果你有两次冲突连续,用您的日志数据写入Microsoft)。我们从一台服务器上获得了数百万个Guids,并且从未发生冲突。 –

回答

6

据我所知Guid.NewGuid()应该足够了。

+0

是的,我只是做了一些更多的阅读,发现这种方法很有用。做了一段时间的循环,并产生了大约20磨,仍然没有得到冲突 – ferronrsmith

+1

@ferronrsmith:你可能需要让这个循环运行几百年,然后才能达到冲突的统计可能性。 – LukeH

+0

大声笑图那么多。谢谢你笑的人:) – ferronrsmith

0

典型的身份验证包括身份(名称)和密码(密码)。您正在设计一个仅包含秘密的认证方案,即。密码(以guid的形式)。这种方法的问题(即不能将身份与密码分离)是因为密码他们的身份,所以用户不能更改密码。

什么Maps API密钥和类似的密钥是别的:它们是由服务提供商签署的声明。例如您的应用调用Maps API的注册域。 Generate键接受您提交的域名,将使用服务的私钥签署该域名,并向您显示publis签名。访问API时,您必须出示已签署并同意服务条款的签名(API密钥)。验证的另一部分(您的应用运行的域,换言之,'声明')会被JavaScript自动检测到。

我绝不是地图API的专家,我可能已经得到了一些部分,但这通常是如何实现的。我建议不要使用guid作为模糊的应用程序ID,因为它没有提供太多价值:任何人都可以使用泄露的guid,并且您无法使用guid验证任何声明。想想你想要保护什么,或者只是使用像OpenId这样的已建立的方案。

+0

@Remus Rusanu生成的GUID密钥将与人的姓名,电子邮件(如果我们希望的话,域名一起)放入数据库中。当用户试图检索信息时,数据库中的数据即GUID将被验证。我打算写一个存储过程进行进一步的加密(没有太多极端)。存储在数据库中的值将与域一起检查,如果这些值不匹配,则返回空值。简单。它没有任何进展,只是在我周围有些鬼混,有些朋友在学校开始回来。反正谢谢 – ferronrsmith

1

从盐,用户名和电子邮件地址中创建一个字符串。然后从该字符串中创建一个散列(MD5或SHA1)。盐可以简单地用作用途,或者可以是其他用途,只要用户不知道。

GUID很好,但在这种情况下它可能是矫枉过正的。你会有数十亿用户吗?你可能会得到1到1000000之间的随机数。然后确保在x次尝试失败后禁用登录,其中x在3和6之间。

+1

亿的用户,LOL。最多它将是约20万 – ferronrsmith

2

如果使用GUID解决方案 - 您可以始终通过查询数据库确保它是唯一的。如果它不是唯一的 - 只需生成一个新的。

+0

这正是我所做的,谢谢:) – ferronrsmith

1

根据您的应用程序的大小和用户数量,Guid可能不是最好的选择,除非您知道如何处理它们。大多数情况下,我已经将这些用作字符串,这只会增加您的存储需求并减慢您的比较例程。匹配的guid的字符串比较必须扫描全部36个字符。对于刚刚以十六进制格式存储的数据而言,这种方法过于夸张。最好将GUID保存为一个整数数组...您在减少搜索的同时减少了存储需求。

如果您只有几千条记录,那么guid作为字符串可能不会有太大影响。但是,如果你的编程规模很大,而且规模很大,那么现在进行适当的调整将会为你节省以后做的痛苦。

如果您正在进行表连接,请使用整数标识进行连接,而不是guid(出于前面提及的相同原因)。

+0

最多我会有大约20万。当时我正在考虑将它们保存为一个整数数组,但是究竟是什么。这不是那么多记录,如果需要,我可以随时改变例程 – ferronrsmith

相关问题