我正在创建一个Web服务,允许应用程序开发人员(A.K.A.我的朋友)查询我的数据库。问题是,作为安全约束,我希望能够跟踪每个用户。我正在创建一个独特的应用ID,如FaceBook或Google地图。
开发者必须提交用户名和电子邮件地址,当他们点击生成时,将生成一个唯一的密钥。问题是,如果用户/电子邮件已经存在,则必须首先检查数据库,并检查密钥是否已经生成(伪随机生成保护)。
要使用网络服务,用户必须输入以下内容:
webservice.Authenticate('app key here');
进行身份验证。提前谢谢。
答案 0 :(得分:6)
据我所知,Guid.NewGuid()
应该足够了。
答案 1 :(得分:2)
如果您使用GUID解决方案 - 您始终可以通过查询数据库确保它是唯一的。如果它不是唯一的 - 只需生成一个新的。
答案 2 :(得分:1)
用盐,用户名和电子邮件地址创建一个字符串。然后从该字符串中创建一个哈希值(MD5或SHA1)。只要用户不知道,盐就可以只是用户ID,也可能是其他东西。
GUID很好,但在这种情况下可能有点过头了。你会有数十亿用户吗?你可能会得到1到1,000,000之间的随机数。然后确保在x次尝试失败后禁用登录,其中x介于3和6之间。
答案 3 :(得分:1)
根据您的应用程序的大小和用户数量,Guid可能不是最佳选择,除非您知道如何处理它们。大多数情况下,我已经看到这些用作字符串,这只会增加您的存储需求并减慢您的比较例程。匹配guid的字符串比较必须扫描所有36个字符。以十六进制格式存储的数据方式过度。最好将GUID保存为整数数组...减少搜索量,同时减少存储需求。
如果你只有几千条记录,那么guid as string可能不会太重要。但是如果你的规模编程和那个规模很大,那么适当的调整现在可以省去你以后做这件事的痛苦。
如果您正在对表进行连接,请使用整数标识来进行连接,而不是guid(出于与已提到的相同的原因)。
答案 4 :(得分:0)
典型身份验证包括身份(名称)和密码(密码)。您正在设计一个仅包含秘密的身份验证方案,即。密码(以guid的形式)。这种方法的问题(即不将身份与密码分开)是用户在受到破坏时无法更改密码,因为密码 是他们的身份。
Maps API密钥和类似密钥是什么:它们是服务提供商签署的声明。例如,您的应用调用Maps API的注册域名。 Generate键接受您提交的域,将使用该服务的私钥对该域名进行签名,并向您显示publis签名。访问API时,您必须出示签名(API密钥),证明您已注册并同意服务条款。验证的另一部分(您的应用运行的域名,换言之,'声明')由JavaScript自动检测。
我绝不是Maps API的专家,我可能已经关闭了一些部分,但这通常是如何实现的。我建议不要使用guid作为混淆的应用程序ID,因为它没有提供太多价值:任何人都可以使用泄漏的guid,你无法使用guid验证任何声明。想想你想要保护什么,或者只是选择像OpenId这样的既定方案。