Как бы вы сгенерировали ключ, действительный только в течение трех месяцев? - PullRequest
1 голос
/ 15 июля 2010

Мне интересно, можно ли сгенерировать «ключ», который действителен в течение (приблизительно) трех месяцев?

Например, предположим (гипотетически), что я сгенерировал такой ключ, как этот(псевдокод):

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 ]

8 голосов
/ 15 июля 2010

Типичный способ сделать это - составить текстовое сообщение, объясняющее, что необходимо для достижения ключа, после чего следует защищенный дайджест. Таким образом, вы бы вернули что-то вроде

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

Обратите внимание, что возвращаемый ключ содержит дату окончания срока действия в виде открытого текста, но также включает его в дайджест, чтобы его нельзя было изменить. Как всегда, нет необходимости декодировать дайджест, только убедитесь, что одни и те же входные данные дали один и тот же дайджест.

1 голос
/ 06 марта 2011

Одна идея состоит в том, чтобы использовать метку времени Unix, а затем разрезать ее на несколько битов, что обеспечивает точность порядка 3 месяцев.

Например: 1275068416 (пт, 28 мая 2010 г. 17:40:16 мск)

невероятно похож на:

010011000 00000000000000000000000

Если мы сохраним 9 бит из этого в хэше, а 9-й бит изменится:

010011001 00000000000000000000000

будет равно: 1283457024 (четверг, 02 сентября 2010 г., 19:50:24 мск)

Разница: 97 дней, 2 часа, 10 минут, 8 секунд

Что на 7 дней больше, чем на 3 месяца.

Скажем, 9-й бит снова изменяется (в прямом направлении):

010011010 00000000000000000000000

равно: 1291845632 (ср., 08 декабря 2010 г. 22:00:32 по Гринвичу) который имеет разницу: 97 дней, 3 часа, 10 минут, 8 секунд с 1283457024 (четверг, 02 сентября 2010 г., 19:50:24 по Гринвичу).

Так что попробуйте, сохраните 9 первых бит строго 32-битной метки времени Unix в хэше, и вы получите срок действия три месяца. Обратите внимание, что срок действия составляет три месяца, поэтому если вы сгенерируете ключ в конце трехмесячного периода (скажем, вторник, 07 декабря 2010 г. 22:00:32 по Гринвичу), он будет действителен только в более короткие сроки. .

...