我想知道是否有可能生成一个有效期为(大约)三个月的“密钥”?
例如,让我们说(假设)我生成一个像这样的密钥(伪代码):
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) )
}
但我想知道是否有任何更好的想法。
答案 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)它只会在更短的时间内生效