你如何生成一个只有三个月有效的密钥?

时间:2010-07-15 07:37:39

标签: security language-agnostic encryption hash key

我想知道是否有可能生成一个有效期为(大约)三个月的“密钥”?

例如,让我们说(假设)我生成一个像这样的密钥(伪代码):

Key = HASH ( MachineID, Salt );

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

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

如何扩展它以生成这样的键:

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

但是你的isValid仍能正常工作吗?

我能看到的一种方式是:

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 个答案:

答案 0 :(得分:8)

这样做的一种典型方法是撰写明文消息,说明到达密钥所需的内容,然后是安全摘要。因此,您将返回类似

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

请注意,返回的密钥包含明文的到期日期,但也包含在摘要中,以便它不会被篡改。与往常一样,没有必要解码摘要,只验证相同的输入产生相同的摘要。

答案 1 :(得分:1)

一个想法是使用unix时间戳,然后将其剪切为多个位,使其具有大约3个月的精度。

例如: 1275068416(2010年5月28日星期五,格林尼治标准时间17:40:16)

等于:

010011000 00000000000000000000000

如果我们在散列中保存了9位,并且第9位改变了:

010011001 00000000000000000000000

它将等于: 1283457024(2010年9月2日星期四19:50:24 GMT)

区别在于: 97天,2小时,10分钟,8秒

超过3个月是7天。

让我们说第9位再次改变(正向):

010011010 00000000000000000000000

等于:1291845632(2010年12月8日星期三,格林威治标准时间22:00:32) 它有以下区别: 距离1283457024(2010年9月2日星期四,格林尼治标准时间19:50:24)97天3小时10分8秒。

所以尝试一下,将哈希中严格的32位unix时间戳的9个第一位保存起来,你将获得三个月的有效期。请注意,有效期为三个月,所以如果您在三个月期间生成一个密钥,(比如Tue,2010年12月7日22:00:32 GMT)它只会在更短的时间内生效