0

我在一个玩具网站上工作,我已经实现了一个 upvote 按钮,具有这样的 onclick 属性:

Dajaxice.debater.upvote(
    upvote_js,//Don't worry about this, it's just dealing with AJAX
    {
         'username' : 'bob',//bob is the user being upvoted by
    }
)

您会看到问题是网页直接使用用户名,这是糟糕的设计,因为用户可以轻松打开 chrome 控制台,更改用户名并伪造一个支持说 alice 而不是 bob 的请求。我调查了几个网站,发现他们使用一个看起来像哈希的长字符串来表示用户。我想知道这通常是如何实现的?以更一般的形式,我正在寻找一种算法:

  1. 为每个用户提供一个唯一的 id
  2. 即使这个 id 暴露给用户或任何第三方,他们也不知道这个 id 代表哪个用户,而无需使用很长时间或大量内存来计算(反转哈希)。
4

2 回答 2

2

您可以生成字符串的加密形式(根据定义,哈希是不可逆的)。

这样做的缺点是,如果有人拥有您所有用户的列表,那么他们可以计算您使用的算法并破解您的加密。

进行可逆加密的常用方法是base64

>>> import base64
>>> secret = base64.b64encode('bob')
>>> secret
'Ym9i'
>>> print base64.b64decode('Ym9i')
bob
于 2013-05-05T10:51:38.657 回答
1

听起来这更像是一个设计问题,而不是编码问题。

即使您以某种方式对用户名进行了哈希处理,也总有一种方法可以通过在某处网页上找到该哈希值的实例来获取哈希值。

您可以实施一个系统,使每个用户只能为另一个用户投票一次,但没有什么可以阻止某人创建多个帐户以绕过限制。

一种常见的解决方案是跟踪哪些 IP 地址对特定用户进行了投票,并禁止来自同一 IP 地址的同一用户多次投票。

于 2013-05-05T10:52:22.137 回答