我有两个服务器和一个客户端,这就是连接的工作方式:
服务器A =其中有很多,每个移动应用程序都有一台服务器。
服务器B =其中只有一个。用于收集特定数据的中央服务器。
User =这些中有很多,这些使用多个不同的移动应用程序。 一个移动应用程序仅连接到一个服务器A和唯一的服务器B.
这就是系统的工作方式:
用户启动移动应用。
移动应用程序要求用户注册。用户添加他的电子邮件,密码,姓名等。移动应用程序将数据发送到服务器A.
服务器A为用户创建用户帐户。服务器A根据电子邮件返回低级别安全散列。
移动应用程序接收散列并将其发送到服务器B(以及其他数据,如电子邮件,坐标,移动应用程序名称,版本等)。
服务器B接收电子邮件和散列,并使用相同的函数重新计算电子邮件中的散列值。如果哈希计算最终与移动应用程序发送的哈希相同,则其他数据(例如坐标等)将添加到服务器B的数据库中。
所以真正的问题是:我是否有现成的哈希算法,或者我应该通过添加一堆md5(),sha1(),strev(),分块,将字母转换为其他字母等来创建一个哈希算法。 (这是非常简单的解释)。
最优化的现成算法只需要在两台服务器上都需要相同的盐。
除了我之外,数据对任何人都没有价值,我们想要将所有这些放在安全散列后面的唯一原因是为了防止麻烦制造者将垃圾数据发送到我们的数据库。
PS。我知道我可以让服务器A向服务器B发送一个随机哈希,然后给用户提供相同的哈希值,但这样就足够了,但我希望将数据发送保持在最低限度,因为服务器B将采用大量连接每秒/分钟。
答案 0 :(得分:2)
听起来你基本上都在寻找预共享秘密,服务器A和B都知道,但其他地方没有透露。您希望能够为用户提供他可以从服务器A到B携带的令牌,这将向服务器B证明用户之前已经与服务器A通信过;没有向用户公开服务器A和B之间共享的秘密。
这里最好的选择可能是HMAC或邮件签名。您为两个服务器提供随机密钥。正在签名的邮件本质上是电子邮件地址,因此服务器A"签署"带有密钥的邮件。服务器B重复该过程并比较两个签名。
请注意,如果任何人在任何时候截获签名,他都可以发起重播攻击(只需对任意新请求重用签名)。 如果用户经常与服务器A通话,您可以通过在签名哈希中包含时间戳来最小化此类重放攻击,用户还需要将该时间戳与电子邮件地址一起发送,并限制有效期签名这样。