1

我正在使用以下程序生成令牌,基于时间(当前时间)。它工作正常,这意味着令牌将被生成。

         public string GenerateToken()
            {
                MD5 md5 = System.Security.Cryptography.MD5.Create();
                DateTime input = DateTime.Now;
                byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input.ToString());
                byte[] hash = md5.ComputeHash(inputBytes);

                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < hash.Length; i++)
                {
                    sb.Append(hash[i].ToString("X2"));
                }
                return sb.ToString();
            }

我使用以下程序尝试在 2 分钟内锁定(过期)令牌。这意味着我访问GetToken() method,它将返回令牌。particular Time(current Time)我需要为该令牌设置有效时间 2 分钟。如果我访问 getToken () 前 2 分钟我需要获得相同的令牌。但我getToken()在 2 分钟后访问我需要获得新令牌。我该怎么做?如何锁定令牌?

     public string GetToken()
        {
            DateTime currentTime = DateTime.UtcNow;               
            tokenExp = DateTime.UtcNow.AddMinutes(2);
            if (tokenExp >= currentTime)
            {
                token = GenerateToken();
                return token;
            }

            else lock (tokenLock)
                {
                    if (tokenExp >= currentTime)
                    {
                        token = GenerateToken();
                        //return token;

                    }
                    return token;
                }
4

2 回答 2

2

您应该在 GenerateToken 方法中使用类似下面的内容

 DateTime dateTime = DateTime.UtcNow;
 dateTime = dateTime.AddSeconds(-dateTime.Second);
 if (dateTime.Minute % 2 != 0)
     dateTime = dateTime.AddMinutes(1);

这将生成偶数分钟的时间,这与 2 分钟的持续时间相同。

更新

完整代码

public string GenerateToken()
{
    MD5 md5 = System.Security.Cryptography.MD5.Create();
    DateTime dateTime = DateTime.UtcNow;
    dateTime = dateTime.AddSeconds(-dateTime.Second);
    if (dateTime.Minute % 2 != 0)
        dateTime = dateTime.AddMinutes(1);

    byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(dateTime.ToString());
    byte[] hash = md5.ComputeHash(inputBytes);

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < hash.Length; i++)
    {
        sb.Append(hash[i].ToString("X2"));
    }
    return sb.ToString();
}
于 2012-04-04T12:11:27.980 回答
0

您正在使用散列,而您应该使用加密

散列是一种方式,但加密是两种方式,即当您取回令牌时,您可以解密令牌以获得原始值,以便能够计算时间差并检查它是否大于 2 分钟。

您可以使用 AES、3DES、...

于 2012-04-04T12:00:16.583 回答