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

Mat*_*ell 1 language-agnostic security encryption hash key

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

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

Key = HASH ( MachineID, Salt );
Run Code Online (Sandbox Code Playgroud)

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

isValid(Key)
{
   return Key == HASH ( MachineID, Salt )
}
Run Code Online (Sandbox Code Playgroud)

你会如何扩展它来生成这样的键:

Key = HASH ( MachineID, Salt, LastMonth, ThisMonth, NextMonth );
Run Code Online (Sandbox Code Playgroud)

但仍然有你的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) )
}
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有任何更好的想法.

Sin*_*ion 8

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

function Key(password, expriry) {
    return "Expires: " + dateformat(expiry) +
           HASH(salt + expiry + password)
}
Run Code Online (Sandbox Code Playgroud)

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