代码之家  ›  专栏  ›  技术社区  ›  Matt Mitchell

如何生成只在三个月内有效的密钥?

  •  1
  • Matt Mitchell  · 技术社区  · 14 年前

    例如,假设我生成了这样一个密钥(伪代码):

    Key = HASH ( MachineID, Salt );
    

    我验证密钥是否有效的方法是这样检查:

    isValid(Key)
    {
       return Key == HASH ( MachineID, Salt )
    }
    

    Key = HASH ( MachineID, Salt, LastMonth, ThisMonth, NextMonth );
    

    但你的工作还正确吗?

    我能看到的一个方法是:

    isValid(Key)
    {
       return Key == HASH ( MachineID, Salt, (LastMonth), (ThisMonth), (NextMonth) )
       || Key == HASH ( MachineID, Salt, (LastMonth-1), (LastMonth), (ThisMonth) )
       || Key == HASH ( MachineID, Salt, (ThisMonth), (ThisMonth+1), (ThisMonth+2) )
    }
    

    但我想知道有没有更好的主意。

    2 回复  |  直到 14 年前
        1
  •  8
  •   SingleNegationElimination    14 年前

    一种典型的方法是编写一条明文消息,解释访问密钥所需的内容,随后是安全摘要。因此你会返回类似

    function Key(password, expriry) {
        return "Expires: " + dateformat(expiry) +
               HASH(salt + expiry + password)
    }
    

        2
  •  1
  •   sebastian nielsen    14 年前

    一种方法是使用unix时间戳,然后将其分成若干位,使其精度达到3个月左右。

    例如: 1275068416(星期五,2010年5月28日17:40:16 GMT)

    等于:

    00000000000000000000000

    如果我们把其中的9位保存在散列中,第9位会改变:

    010011001

    等于: 1283457024(周四,2010年9月2日19:50:24 GMT)

    97天2小时10分8秒

    比3个月多7天。

    假设第9位再次更改(正向):

    010011010 00000000000000000000000

    等于:1291845632(星期三,2010年12月8日22:00:32 GMT) 其区别在于: 距1283457024(2010年9月2日星期四19:50:24 GMT)97天3小时10分8秒。

    因此,尝试一下,将严格意义上的32位unix时间戳的前9位保存在hash中,您将获得3个月的有效期。请注意,有效期是以三个月为单位的,因此,如果在三个月期限结束时生成密钥(例如,2010年12月7日星期二22:00:32 GMT),它将只在较短的时间内有效。