【问题标题】:Implementing a generation of HttpSession key实现生成HttpSession key
【发布时间】:2011-03-26 20:15:51
【问题描述】:

我正在尝试实现生成HttpSession密钥

我正在生成一个介于 1,000,000 到 9,999,999 之间的随机数,并将其作为 cookie 发送给用户。

是否有可能使这个过程安全? 任何人都可以创建一个这样的随机数并尝试访问我的服务器...也许我需要更大的范围?

另一个问题是,我怎样才能生成我以前没有生成的数字?现在我每次使用该号码时都会重新生成,是否有可能以更好的方式做到这一点?

【问题讨论】:

    标签: java security cookies random httpsession


    【解决方案1】:

    使用UUID。具体来说,UUID.randomUUID()Here's a discussion 关于碰撞的可能性。

    【讨论】:

      【解决方案2】:

      这听起来很像您正在尝试实现一些基本身份验证。可以尝试的东西(在伪代码中;我不擅长网络上的 Java):

      random_number = rand(1000000, 9999999);
      secret = "Some random text here";
      timestamp = unix_timestamp(); // Get a UNIX timestamp
      user_ip = users_ip(); // Get the user's IP
      setcookie("random_number", random_number); // Save the random number
      setcookie("timestamp", timestamp);
      setcookie("token", sha256(random_number + secret + timestamp + ip)); // Concat and hash everything to form a token
      

      当您想检查随机数是否有效时,只需将所有部分拉回一起并与令牌进行比较:

      random_number = getcookie("random_number");
      secret = "Some random text here";
      timestamp = int(getcookie("timestamp"));
      user_ip = users_ip(); // Get the user's IP
      token = sha256(random_number + secret + timestamp + ip);
      
      if(unix_timestamp() - timestamp < 0 || unix_timestamp() - timestamp > timeout) {
          // The token is more than an hour old; it might have been stolen.
      }
      if(token == getcookie("token")) {
          // The user is valid
      } else {
          // The user is invalid
      }
      

      此代码将通过确保随机数来自同一 IP 来阻止某人欺骗随机数。您还可以使用时间戳来确保用户的会话随着时间的推移而过期。这将防止黑客简单地生成一个好的数字并永远使用它。

      至于秘密,那是一个随机的文本块。它应该是完全随机的,并且永远不会被共享。它基本上使您的令牌几乎不可能进行逆向工程(否则,只需尝试“数字时间戳 ip”、“ip 数字时间戳”等组合)。

      还应该注意的是,使用 HMAC 可以更好地完成这样的事情,但这对于您想要做的事情来说可能有点矫枉过正。此解决方案将按原样完成该死的好工作。

      希望这会有所帮助。

      编辑

      请注意,您的密码必须相同才能使验证生效。

      【讨论】:

        【解决方案3】:

        我问过自己同样的问题,并在这里找到了一个很好的答案: Create GUID / UUID in JavaScript?

        您最好阅读有关 RFC 4122 的更多信息,看看这是否是您的意思。 我正在将这个伪代码用于 NodeJS 项目,它完成了这项工作。

        顺便说一句:为了安全起见,您需要超过 7 位数字..

        【讨论】:

        • 为什么你会选择这种手卷方法而不是 Java 中的 UUID,这完全是个谜。请注意不要使用加密性强的伪随机数生成器。
        猜你喜欢
        • 2010-12-25
        • 2012-12-04
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        • 2011-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多