mirror of
https://github.com/1f349/twofactor.git
synced 2024-12-22 07:24:12 +00:00
2076 lines
75 KiB
Plaintext
2076 lines
75 KiB
Plaintext
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
Network Working Group D. M'Raihi
|
|||
|
Request for Comments: 4226 VeriSign
|
|||
|
Category: Informational M. Bellare
|
|||
|
UCSD
|
|||
|
F. Hoornaert
|
|||
|
Vasco
|
|||
|
D. Naccache
|
|||
|
Gemplus
|
|||
|
O. Ranen
|
|||
|
Aladdin
|
|||
|
December 2005
|
|||
|
|
|||
|
|
|||
|
HOTP: An HMAC-Based One-Time Password Algorithm
|
|||
|
|
|||
|
Status of This Memo
|
|||
|
|
|||
|
This memo provides information for the Internet community. It does
|
|||
|
not specify an Internet standard of any kind. Distribution of this
|
|||
|
memo is unlimited.
|
|||
|
|
|||
|
Copyright Notice
|
|||
|
|
|||
|
Copyright (C) The Internet Society (2005).
|
|||
|
|
|||
|
Abstract
|
|||
|
|
|||
|
This document describes an algorithm to generate one-time password
|
|||
|
values, based on Hashed Message Authentication Code (HMAC). A
|
|||
|
security analysis of the algorithm is presented, and important
|
|||
|
parameters related to the secure deployment of the algorithm are
|
|||
|
discussed. The proposed algorithm can be used across a wide range of
|
|||
|
network applications ranging from remote Virtual Private Network
|
|||
|
(VPN) access, Wi-Fi network logon to transaction-oriented Web
|
|||
|
applications.
|
|||
|
|
|||
|
This work is a joint effort by the OATH (Open AuTHentication)
|
|||
|
membership to specify an algorithm that can be freely distributed to
|
|||
|
the technical community. The authors believe that a common and
|
|||
|
shared algorithm will facilitate adoption of two-factor
|
|||
|
authentication on the Internet by enabling interoperability across
|
|||
|
commercial and open-source implementations.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 1]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
Table of Contents
|
|||
|
|
|||
|
1. Overview ........................................................3
|
|||
|
2. Introduction ....................................................3
|
|||
|
3. Requirements Terminology ........................................4
|
|||
|
4. Algorithm Requirements ..........................................4
|
|||
|
5. HOTP Algorithm ..................................................5
|
|||
|
5.1. Notation and Symbols .......................................5
|
|||
|
5.2. Description ................................................6
|
|||
|
5.3. Generating an HOTP Value ...................................6
|
|||
|
5.4. Example of HOTP Computation for Digit = 6 ..................7
|
|||
|
6. Security Considerations .........................................8
|
|||
|
7. Security Requirements ...........................................9
|
|||
|
7.1. Authentication Protocol Requirements .......................9
|
|||
|
7.2. Validation of HOTP Values .................................10
|
|||
|
7.3. Throttling at the Server ..................................10
|
|||
|
7.4. Resynchronization of the Counter ..........................11
|
|||
|
7.5. Management of Shared Secrets ..............................11
|
|||
|
8. Composite Shared Secrets .......................................14
|
|||
|
9. Bi-Directional Authentication ..................................14
|
|||
|
10. Conclusion ....................................................15
|
|||
|
11. Acknowledgements ..............................................15
|
|||
|
12. Contributors ..................................................15
|
|||
|
13. References ....................................................15
|
|||
|
13.1. Normative References .....................................15
|
|||
|
13.2. Informative References ...................................16
|
|||
|
Appendix A - HOTP Algorithm Security: Detailed Analysis ...........17
|
|||
|
A.1. Definitions and Notations .................................17
|
|||
|
A.2. The Idealized Algorithm: HOTP-IDEAL .......................17
|
|||
|
A.3. Model of Security .........................................18
|
|||
|
A.4. Security of the Ideal Authentication Algorithm ............19
|
|||
|
A.4.1. From Bits to Digits ................................19
|
|||
|
A.4.2. Brute Force Attacks ................................21
|
|||
|
A.4.3. Brute force attacks are the best possible attacks ..22
|
|||
|
A.5. Security Analysis of HOTP .................................23
|
|||
|
Appendix B - SHA-1 Attacks ........................................25
|
|||
|
B.1. SHA-1 Status ..............................................25
|
|||
|
B.2. HMAC-SHA-1 Status .........................................26
|
|||
|
B.3. HOTP Status ...............................................26
|
|||
|
Appendix C - HOTP Algorithm: Reference Implementation .............27
|
|||
|
Appendix D - HOTP Algorithm: Test Values ..........................32
|
|||
|
Appendix E - Extensions ...........................................33
|
|||
|
E.1. Number of Digits ..........................................33
|
|||
|
E.2. Alphanumeric Values .......................................33
|
|||
|
E.3. Sequence of HOTP values ...................................34
|
|||
|
E.4. A Counter-Based Resynchronization Method ..................34
|
|||
|
E.5. Data Field ................................................35
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 2]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
1. Overview
|
|||
|
|
|||
|
The document introduces first the context around an algorithm that
|
|||
|
generates one-time password values based on HMAC [BCK1] and, thus, is
|
|||
|
named the HMAC-Based One-Time Password (HOTP) algorithm. In Section
|
|||
|
4, the algorithm requirements are listed and in Section 5, the HOTP
|
|||
|
algorithm is described. Sections 6 and 7 focus on the algorithm
|
|||
|
security. Section 8 proposes some extensions and improvements, and
|
|||
|
Section 10 concludes this document. In Appendix A, the interested
|
|||
|
reader will find a detailed, full-fledged analysis of the algorithm
|
|||
|
security: an idealized version of the algorithm is evaluated, and
|
|||
|
then the HOTP algorithm security is analyzed.
|
|||
|
|
|||
|
2. Introduction
|
|||
|
|
|||
|
Today, deployment of two-factor authentication remains extremely
|
|||
|
limited in scope and scale. Despite increasingly higher levels of
|
|||
|
threats and attacks, most Internet applications still rely on weak
|
|||
|
authentication schemes for policing user access. The lack of
|
|||
|
interoperability among hardware and software technology vendors has
|
|||
|
been a limiting factor in the adoption of two-factor authentication
|
|||
|
technology. In particular, the absence of open specifications has
|
|||
|
led to solutions where hardware and software components are tightly
|
|||
|
coupled through proprietary technology, resulting in high-cost
|
|||
|
solutions, poor adoption, and limited innovation.
|
|||
|
|
|||
|
In the last two years, the rapid rise of network threats has exposed
|
|||
|
the inadequacies of static passwords as the primary mean of
|
|||
|
authentication on the Internet. At the same time, the current
|
|||
|
approach that requires an end user to carry an expensive, single-
|
|||
|
function device that is only used to authenticate to the network is
|
|||
|
clearly not the right answer. For two-factor authentication to
|
|||
|
propagate on the Internet, it will have to be embedded in more
|
|||
|
flexible devices that can work across a wide range of applications.
|
|||
|
|
|||
|
The ability to embed this base technology while ensuring broad
|
|||
|
interoperability requires that it be made freely available to the
|
|||
|
broad technical community of hardware and software developers. Only
|
|||
|
an open-system approach will ensure that basic two-factor
|
|||
|
authentication primitives can be built into the next generation of
|
|||
|
consumer devices such as USB mass storage devices, IP phones, and
|
|||
|
personal digital assistants.
|
|||
|
|
|||
|
One-Time Password is certainly one of the simplest and most popular
|
|||
|
forms of two-factor authentication for securing network access. For
|
|||
|
example, in large enterprises, Virtual Private Network access often
|
|||
|
requires the use of One-Time Password tokens for remote user
|
|||
|
authentication. One-Time Passwords are often preferred to stronger
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 3]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
forms of authentication such as Public-Key Infrastructure (PKI) or
|
|||
|
biometrics because an air-gap device does not require the
|
|||
|
installation of any client desktop software on the user machine,
|
|||
|
therefore allowing them to roam across multiple machines including
|
|||
|
home computers, kiosks, and personal digital assistants.
|
|||
|
|
|||
|
This document proposes a simple One-Time Password algorithm that can
|
|||
|
be implemented by any hardware manufacturer or software developer to
|
|||
|
create interoperable authentication devices and software agents. The
|
|||
|
algorithm is event-based so that it can be embedded in high-volume
|
|||
|
devices such as Java smart cards, USB dongles, and GSM SIM cards.
|
|||
|
The presented algorithm is made freely available to the developer
|
|||
|
community under the terms and conditions of the IETF Intellectual
|
|||
|
Property Rights [RFC3979].
|
|||
|
|
|||
|
The authors of this document are members of the Open AuTHentication
|
|||
|
initiative [OATH]. The initiative was created in 2004 to facilitate
|
|||
|
collaboration among strong authentication technology providers.
|
|||
|
|
|||
|
3. Requirements Terminology
|
|||
|
|
|||
|
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
|
|||
|
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
|
|||
|
document are to be interpreted as described in [RFC2119].
|
|||
|
|
|||
|
4. Algorithm Requirements
|
|||
|
|
|||
|
This section presents the main requirements that drove this algorithm
|
|||
|
design. A lot of emphasis was placed on end-consumer usability as
|
|||
|
well as the ability for the algorithm to be implemented by low-cost
|
|||
|
hardware that may provide minimal user interface capabilities. In
|
|||
|
particular, the ability to embed the algorithm into high-volume SIM
|
|||
|
and Java cards was a fundamental prerequisite.
|
|||
|
|
|||
|
R1 - The algorithm MUST be sequence- or counter-based: one of the
|
|||
|
goals is to have the HOTP algorithm embedded in high-volume devices
|
|||
|
such as Java smart cards, USB dongles, and GSM SIM cards.
|
|||
|
|
|||
|
R2 - The algorithm SHOULD be economical to implement in hardware by
|
|||
|
minimizing requirements on battery, number of buttons, computational
|
|||
|
horsepower, and size of LCD display.
|
|||
|
|
|||
|
R3 - The algorithm MUST work with tokens that do not support any
|
|||
|
numeric input, but MAY also be used with more sophisticated devices
|
|||
|
such as secure PIN-pads.
|
|||
|
|
|||
|
R4 - The value displayed on the token MUST be easily read and entered
|
|||
|
by the user: This requires the HOTP value to be of reasonable length.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 4]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
The HOTP value must be at least a 6-digit value. It is also
|
|||
|
desirable that the HOTP value be 'numeric only' so that it can be
|
|||
|
easily entered on restricted devices such as phones.
|
|||
|
|
|||
|
R5 - There MUST be user-friendly mechanisms available to
|
|||
|
resynchronize the counter. Section 7.4 and Appendix E.4 details the
|
|||
|
resynchronization mechanism proposed in this document
|
|||
|
|
|||
|
R6 - The algorithm MUST use a strong shared secret. The length of
|
|||
|
the shared secret MUST be at least 128 bits. This document
|
|||
|
RECOMMENDs a shared secret length of 160 bits.
|
|||
|
|
|||
|
5. HOTP Algorithm
|
|||
|
|
|||
|
In this section, we introduce the notation and describe the HOTP
|
|||
|
algorithm basic blocks -- the base function to compute an HMAC-SHA-1
|
|||
|
value and the truncation method to extract an HOTP value.
|
|||
|
|
|||
|
5.1. Notation and Symbols
|
|||
|
|
|||
|
A string always means a binary string, meaning a sequence of zeros
|
|||
|
and ones.
|
|||
|
|
|||
|
If s is a string, then |s| denotes its length.
|
|||
|
|
|||
|
If n is a number, then |n| denotes its absolute value.
|
|||
|
|
|||
|
If s is a string, then s[i] denotes its i-th bit. We start numbering
|
|||
|
the bits at 0, so s = s[0]s[1]...s[n-1] where n = |s| is the length
|
|||
|
of s.
|
|||
|
|
|||
|
Let StToNum (String to Number) denote the function that as input a
|
|||
|
string s returns the number whose binary representation is s. (For
|
|||
|
example, StToNum(110) = 6.)
|
|||
|
|
|||
|
Here is a list of symbols used in this document.
|
|||
|
|
|||
|
Symbol Represents
|
|||
|
-------------------------------------------------------------------
|
|||
|
C 8-byte counter value, the moving factor. This counter
|
|||
|
MUST be synchronized between the HOTP generator (client)
|
|||
|
and the HOTP validator (server).
|
|||
|
|
|||
|
K shared secret between client and server; each HOTP
|
|||
|
generator has a different and unique secret K.
|
|||
|
|
|||
|
T throttling parameter: the server will refuse connections
|
|||
|
from a user after T unsuccessful authentication attempts.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 5]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
|
|||
|
s resynchronization parameter: the server will attempt to
|
|||
|
verify a received authenticator across s consecutive
|
|||
|
counter values.
|
|||
|
|
|||
|
Digit number of digits in an HOTP value; system parameter.
|
|||
|
|
|||
|
5.2. Description
|
|||
|
|
|||
|
The HOTP algorithm is based on an increasing counter value and a
|
|||
|
static symmetric key known only to the token and the validation
|
|||
|
service. In order to create the HOTP value, we will use the HMAC-
|
|||
|
SHA-1 algorithm, as defined in RFC 2104 [BCK2].
|
|||
|
|
|||
|
As the output of the HMAC-SHA-1 calculation is 160 bits, we must
|
|||
|
truncate this value to something that can be easily entered by a
|
|||
|
user.
|
|||
|
|
|||
|
HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))
|
|||
|
|
|||
|
Where:
|
|||
|
|
|||
|
- Truncate represents the function that converts an HMAC-SHA-1
|
|||
|
value into an HOTP value as defined in Section 5.3.
|
|||
|
|
|||
|
The Key (K), the Counter (C), and Data values are hashed high-order
|
|||
|
byte first.
|
|||
|
|
|||
|
The HOTP values generated by the HOTP generator are treated as big
|
|||
|
endian.
|
|||
|
|
|||
|
5.3. Generating an HOTP Value
|
|||
|
|
|||
|
We can describe the operations in 3 distinct steps:
|
|||
|
|
|||
|
Step 1: Generate an HMAC-SHA-1 value Let HS = HMAC-SHA-1(K,C) // HS
|
|||
|
is a 20-byte string
|
|||
|
|
|||
|
Step 2: Generate a 4-byte string (Dynamic Truncation)
|
|||
|
Let Sbits = DT(HS) // DT, defined below,
|
|||
|
// returns a 31-bit string
|
|||
|
|
|||
|
Step 3: Compute an HOTP value
|
|||
|
Let Snum = StToNum(Sbits) // Convert S to a number in
|
|||
|
0...2^{31}-1
|
|||
|
Return D = Snum mod 10^Digit // D is a number in the range
|
|||
|
0...10^{Digit}-1
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 6]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
The Truncate function performs Step 2 and Step 3, i.e., the dynamic
|
|||
|
truncation and then the reduction modulo 10^Digit. The purpose of
|
|||
|
the dynamic offset truncation technique is to extract a 4-byte
|
|||
|
dynamic binary code from a 160-bit (20-byte) HMAC-SHA-1 result.
|
|||
|
|
|||
|
DT(String) // String = String[0]...String[19]
|
|||
|
Let OffsetBits be the low-order 4 bits of String[19]
|
|||
|
Offset = StToNum(OffsetBits) // 0 <= OffSet <= 15
|
|||
|
Let P = String[OffSet]...String[OffSet+3]
|
|||
|
Return the Last 31 bits of P
|
|||
|
|
|||
|
The reason for masking the most significant bit of P is to avoid
|
|||
|
confusion about signed vs. unsigned modulo computations. Different
|
|||
|
processors perform these operations differently, and masking out the
|
|||
|
signed bit removes all ambiguity.
|
|||
|
|
|||
|
Implementations MUST extract a 6-digit code at a minimum and possibly
|
|||
|
7 and 8-digit code. Depending on security requirements, Digit = 7 or
|
|||
|
more SHOULD be considered in order to extract a longer HOTP value.
|
|||
|
|
|||
|
The following paragraph is an example of using this technique for
|
|||
|
Digit = 6, i.e., that a 6-digit HOTP value is calculated from the
|
|||
|
HMAC value.
|
|||
|
|
|||
|
5.4. Example of HOTP Computation for Digit = 6
|
|||
|
|
|||
|
The following code example describes the extraction of a dynamic
|
|||
|
binary code given that hmac_result is a byte array with the HMAC-
|
|||
|
SHA-1 result:
|
|||
|
|
|||
|
int offset = hmac_result[19] & 0xf ;
|
|||
|
int bin_code = (hmac_result[offset] & 0x7f) << 24
|
|||
|
| (hmac_result[offset+1] & 0xff) << 16
|
|||
|
| (hmac_result[offset+2] & 0xff) << 8
|
|||
|
| (hmac_result[offset+3] & 0xff) ;
|
|||
|
|
|||
|
SHA-1 HMAC Bytes (Example)
|
|||
|
|
|||
|
-------------------------------------------------------------
|
|||
|
| Byte Number |
|
|||
|
-------------------------------------------------------------
|
|||
|
|00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|
|
|||
|
-------------------------------------------------------------
|
|||
|
| Byte Value |
|
|||
|
-------------------------------------------------------------
|
|||
|
|1f|86|98|69|0e|02|ca|16|61|85|50|ef|7f|19|da|8e|94|5b|55|5a|
|
|||
|
-------------------------------***********----------------++|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 7]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
* The last byte (byte 19) has the hex value 0x5a.
|
|||
|
* The value of the lower 4 bits is 0xa (the offset value).
|
|||
|
* The offset value is byte 10 (0xa).
|
|||
|
* The value of the 4 bytes starting at byte 10 is 0x50ef7f19,
|
|||
|
which is the dynamic binary code DBC1.
|
|||
|
* The MSB of DBC1 is 0x50 so DBC2 = DBC1 = 0x50ef7f19 .
|
|||
|
* HOTP = DBC2 modulo 10^6 = 872921.
|
|||
|
|
|||
|
We treat the dynamic binary code as a 31-bit, unsigned, big-endian
|
|||
|
integer; the first byte is masked with a 0x7f.
|
|||
|
|
|||
|
We then take this number modulo 1,000,000 (10^6) to generate the 6-
|
|||
|
digit HOTP value 872921 decimal.
|
|||
|
|
|||
|
6. Security Considerations
|
|||
|
|
|||
|
The conclusion of the security analysis detailed in the Appendix is
|
|||
|
that, for all practical purposes, the outputs of the Dynamic
|
|||
|
Truncation (DT) on distinct counter inputs are uniformly and
|
|||
|
independently distributed 31-bit strings.
|
|||
|
|
|||
|
The security analysis then details the impact of the conversion from
|
|||
|
a string to an integer and the final reduction modulo 10^Digit, where
|
|||
|
Digit is the number of digits in an HOTP value.
|
|||
|
|
|||
|
The analysis demonstrates that these final steps introduce a
|
|||
|
negligible bias, which does not impact the security of the HOTP
|
|||
|
algorithm, in the sense that the best possible attack against the
|
|||
|
HOTP function is the brute force attack.
|
|||
|
|
|||
|
Assuming an adversary is able to observe numerous protocol exchanges
|
|||
|
and collect sequences of successful authentication values. This
|
|||
|
adversary, trying to build a function F to generate HOTP values based
|
|||
|
on his observations, will not have a significant advantage over a
|
|||
|
random guess.
|
|||
|
|
|||
|
The logical conclusion is simply that the best strategy will once
|
|||
|
again be to perform a brute force attack to enumerate and try all the
|
|||
|
possible values.
|
|||
|
|
|||
|
Considering the security analysis in the Appendix of this document,
|
|||
|
without loss of generality, we can approximate closely the security
|
|||
|
of the HOTP algorithm by the following formula:
|
|||
|
|
|||
|
Sec = sv/10^Digit
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 8]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
Where:
|
|||
|
- Sec is the probability of success of the adversary;
|
|||
|
- s is the look-ahead synchronization window size;
|
|||
|
- v is the number of verification attempts;
|
|||
|
- Digit is the number of digits in HOTP values.
|
|||
|
|
|||
|
Obviously, we can play with s, T (the Throttling parameter that would
|
|||
|
limit the number of attempts by an attacker), and Digit until
|
|||
|
achieving a certain level of security, still preserving the system
|
|||
|
usability.
|
|||
|
|
|||
|
7. Security Requirements
|
|||
|
|
|||
|
Any One-Time Password algorithm is only as secure as the application
|
|||
|
and the authentication protocols that implement it. Therefore, this
|
|||
|
section discusses the critical security requirements that our choice
|
|||
|
of algorithm imposes on the authentication protocol and validation
|
|||
|
software.
|
|||
|
|
|||
|
The parameters T and s discussed in this section have a significant
|
|||
|
impact on the security -- further details in Section 6 elaborate on
|
|||
|
the relations between these parameters and their impact on the system
|
|||
|
security.
|
|||
|
|
|||
|
It is also important to remark that the HOTP algorithm is not a
|
|||
|
substitute for encryption and does not provide for the privacy of
|
|||
|
data transmission. Other mechanisms should be used to defeat attacks
|
|||
|
aimed at breaking confidentiality and privacy of transactions.
|
|||
|
|
|||
|
7.1. Authentication Protocol Requirements
|
|||
|
|
|||
|
We introduce in this section some requirements for a protocol P
|
|||
|
implementing HOTP as the authentication method between a prover and a
|
|||
|
verifier.
|
|||
|
|
|||
|
RP1 - P MUST support two-factor authentication, i.e., the
|
|||
|
communication and verification of something you know (secret code
|
|||
|
such as a Password, Pass phrase, PIN code, etc.) and something you
|
|||
|
have (token). The secret code is known only to the user and usually
|
|||
|
entered with the One-Time Password value for authentication purpose
|
|||
|
(two-factor authentication).
|
|||
|
|
|||
|
RP2 - P SHOULD NOT be vulnerable to brute force attacks. This
|
|||
|
implies that a throttling/lockout scheme is RECOMMENDED on the
|
|||
|
validation server side.
|
|||
|
|
|||
|
RP3 - P SHOULD be implemented over a secure channel in order to
|
|||
|
protect users' privacy and avoid replay attacks.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 9]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
7.2. Validation of HOTP Values
|
|||
|
|
|||
|
The HOTP client (hardware or software token) increments its counter
|
|||
|
and then calculates the next HOTP value HOTP client. If the value
|
|||
|
received by the authentication server matches the value calculated by
|
|||
|
the client, then the HOTP value is validated. In this case, the
|
|||
|
server increments the counter value by one.
|
|||
|
|
|||
|
If the value received by the server does not match the value
|
|||
|
calculated by the client, the server initiate the resynch protocol
|
|||
|
(look-ahead window) before it requests another pass.
|
|||
|
|
|||
|
If the resynch fails, the server asks then for another
|
|||
|
authentication pass of the protocol to take place, until the
|
|||
|
maximum number of authorized attempts is reached.
|
|||
|
|
|||
|
If and when the maximum number of authorized attempts is reached, the
|
|||
|
server SHOULD lock out the account and initiate a procedure to inform
|
|||
|
the user.
|
|||
|
|
|||
|
7.3. Throttling at the Server
|
|||
|
|
|||
|
Truncating the HMAC-SHA-1 value to a shorter value makes a brute
|
|||
|
force attack possible. Therefore, the authentication server needs to
|
|||
|
detect and stop brute force attacks.
|
|||
|
|
|||
|
We RECOMMEND setting a throttling parameter T, which defines the
|
|||
|
maximum number of possible attempts for One-Time Password validation.
|
|||
|
The validation server manages individual counters per HOTP device in
|
|||
|
order to take note of any failed attempt. We RECOMMEND T not to be
|
|||
|
too large, particularly if the resynchronization method used on the
|
|||
|
server is window-based, and the window size is large. T SHOULD be
|
|||
|
set as low as possible, while still ensuring that usability is not
|
|||
|
significantly impacted.
|
|||
|
|
|||
|
Another option would be to implement a delay scheme to avoid a brute
|
|||
|
force attack. After each failed attempt A, the authentication server
|
|||
|
would wait for an increased T*A number of seconds, e.g., say T = 5,
|
|||
|
then after 1 attempt, the server waits for 5 seconds, at the second
|
|||
|
failed attempt, it waits for 5*2 = 10 seconds, etc.
|
|||
|
|
|||
|
The delay or lockout schemes MUST be across login sessions to prevent
|
|||
|
attacks based on multiple parallel guessing techniques.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 10]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
7.4. Resynchronization of the Counter
|
|||
|
|
|||
|
Although the server's counter value is only incremented after a
|
|||
|
successful HOTP authentication, the counter on the token is
|
|||
|
incremented every time a new HOTP is requested by the user. Because
|
|||
|
of this, the counter values on the server and on the token might be
|
|||
|
out of synchronization.
|
|||
|
|
|||
|
We RECOMMEND setting a look-ahead parameter s on the server, which
|
|||
|
defines the size of the look-ahead window. In a nutshell, the server
|
|||
|
can recalculate the next s HOTP-server values, and check them against
|
|||
|
the received HOTP client.
|
|||
|
|
|||
|
Synchronization of counters in this scenario simply requires the
|
|||
|
server to calculate the next HOTP values and determine if there is a
|
|||
|
match. Optionally, the system MAY require the user to send a
|
|||
|
sequence of (say, 2, 3) HOTP values for resynchronization purpose,
|
|||
|
since forging a sequence of consecutive HOTP values is even more
|
|||
|
difficult than guessing a single HOTP value.
|
|||
|
|
|||
|
The upper bound set by the parameter s ensures the server does not go
|
|||
|
on checking HOTP values forever (causing a denial-of-service attack)
|
|||
|
and also restricts the space of possible solutions for an attacker
|
|||
|
trying to manufacture HOTP values. s SHOULD be set as low as
|
|||
|
possible, while still ensuring that usability is not impacted.
|
|||
|
|
|||
|
7.5. Management of Shared Secrets
|
|||
|
|
|||
|
The operations dealing with the shared secrets used to generate and
|
|||
|
verify OTP values must be performed securely, in order to mitigate
|
|||
|
risks of any leakage of sensitive information. We describe in this
|
|||
|
section different modes of operations and techniques to perform these
|
|||
|
different operations with respect to the state of the art in data
|
|||
|
security.
|
|||
|
|
|||
|
We can consider two different avenues for generating and storing
|
|||
|
(securely) shared secrets in the Validation system:
|
|||
|
|
|||
|
* Deterministic Generation: secrets are derived from a master
|
|||
|
seed, both at provisioning and verification stages and generated
|
|||
|
on-the-fly whenever it is required.
|
|||
|
* Random Generation: secrets are generated randomly at
|
|||
|
provisioning stage and must be stored immediately and kept
|
|||
|
secure during their life cycle.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 11]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
Deterministic Generation
|
|||
|
------------------------
|
|||
|
|
|||
|
A possible strategy is to derive the shared secrets from a master
|
|||
|
secret. The master secret will be stored at the server only. A
|
|||
|
tamper-resistant device MUST be used to store the master key and
|
|||
|
derive the shared secrets from the master key and some public
|
|||
|
information. The main benefit would be to avoid the exposure of the
|
|||
|
shared secrets at any time and also avoid specific requirements on
|
|||
|
storage, since the shared secrets could be generated on-demand when
|
|||
|
needed at provisioning and validation time.
|
|||
|
|
|||
|
We distinguish two different cases:
|
|||
|
|
|||
|
- A single master key MK is used to derive the shared secrets;
|
|||
|
each HOTP device has a different secret, K_i = SHA-1 (MK,i)
|
|||
|
where i stands for a public piece of information that identifies
|
|||
|
uniquely the HOTP device such as a serial number, a token ID,
|
|||
|
etc. Obviously, this is in the context of an application or
|
|||
|
service -- different application or service providers will have
|
|||
|
different secrets and settings.
|
|||
|
- Several master keys MK_i are used and each HOTP device stores a
|
|||
|
set of different derived secrets, {K_i,j = SHA-1(MK_i,j)} where
|
|||
|
j stands for a public piece of information identifying the
|
|||
|
device. The idea would be to store ONLY the active master key
|
|||
|
at the validation server, in the Hardware Security Module (HSM),
|
|||
|
and keep in a safe place, using secret sharing methods such as
|
|||
|
[Shamir] for instance. In this case, if a master secret MK_i is
|
|||
|
compromised, then it is possible to switch to another secret
|
|||
|
without replacing all the devices.
|
|||
|
|
|||
|
The drawback in the deterministic case is that the exposure of the
|
|||
|
master secret would obviously enable an attacker to rebuild any
|
|||
|
shared secret based on correct public information. The revocation of
|
|||
|
all secrets would be required, or switching to a new set of secrets
|
|||
|
in the case of multiple master keys.
|
|||
|
|
|||
|
On the other hand, the device used to store the master key(s) and
|
|||
|
generate the shared secrets MUST be tamper resistant. Furthermore,
|
|||
|
the HSM will not be exposed outside the security perimeter of the
|
|||
|
validation system, therefore reducing the risk of leakage.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 12]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
Random Generation
|
|||
|
-----------------
|
|||
|
|
|||
|
The shared secrets are randomly generated. We RECOMMEND following
|
|||
|
the recommendations in [RFC4086] and selecting a good and secure
|
|||
|
random source for generating these secrets. A (true) random
|
|||
|
generator requires a naturally occurring source of randomness.
|
|||
|
Practically, there are two possible avenues to consider for the
|
|||
|
generation of the shared secrets:
|
|||
|
|
|||
|
* Hardware-based generators: they exploit the randomness that
|
|||
|
occurs in physical phenomena. A nice implementation can be based on
|
|||
|
oscillators and built in such ways that active attacks are more
|
|||
|
difficult to perform.
|
|||
|
|
|||
|
* Software-based generators: designing a good software random
|
|||
|
generator is not an easy task. A simple, but efficient,
|
|||
|
implementation should be based on various sources and apply to the
|
|||
|
sampled sequence a one-way function such as SHA-1.
|
|||
|
|
|||
|
We RECOMMEND selecting proven products, being hardware or software
|
|||
|
generators, for the computation of shared secrets.
|
|||
|
|
|||
|
We also RECOMMEND storing the shared secrets securely, and more
|
|||
|
specifically encrypting the shared secrets when stored using tamper-
|
|||
|
resistant hardware encryption and exposing them only when required:
|
|||
|
for example, the shared secret is decrypted when needed to verify an
|
|||
|
HOTP value, and re-encrypted immediately to limit exposure in the RAM
|
|||
|
for a short period of time. The data store holding the shared
|
|||
|
secrets MUST be in a secure area, to avoid as much as possible direct
|
|||
|
attack on the validation system and secrets database.
|
|||
|
|
|||
|
Particularly, access to the shared secrets should be limited to
|
|||
|
programs and processes required by the validation system only. We
|
|||
|
will not elaborate on the different security mechanisms to put in
|
|||
|
place, but obviously, the protection of shared secrets is of the
|
|||
|
uttermost importance.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 13]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
8. Composite Shared Secrets
|
|||
|
|
|||
|
It may be desirable to include additional authentication factors in
|
|||
|
the shared secret K. These additional factors can consist of any
|
|||
|
data known at the token but not easily obtained by others. Examples
|
|||
|
of such data include:
|
|||
|
|
|||
|
* PIN or Password obtained as user input at the token
|
|||
|
* Phone number
|
|||
|
* Any unique identifier programmatically available at the token
|
|||
|
|
|||
|
In this scenario, the composite shared secret K is constructed during
|
|||
|
the provisioning process from a random seed value combined with one
|
|||
|
or more additional authentication factors. The server could either
|
|||
|
build on-demand or store composite secrets -- in any case, depending
|
|||
|
on implementation choice, the token only stores the seed value. When
|
|||
|
the token performs the HOTP calculation, it computes K from the seed
|
|||
|
value and the locally derived or input values of the other
|
|||
|
authentication factors.
|
|||
|
|
|||
|
The use of composite shared secrets can strengthen HOTP-based
|
|||
|
authentication systems through the inclusion of additional
|
|||
|
authentication factors at the token. To the extent that the token is
|
|||
|
a trusted device, this approach has the further benefit of not
|
|||
|
requiring exposure of the authentication factors (such as the user
|
|||
|
input PIN) to other devices.
|
|||
|
|
|||
|
9. Bi-Directional Authentication
|
|||
|
|
|||
|
Interestingly enough, the HOTP client could also be used to
|
|||
|
authenticate the validation server, claiming that it is a genuine
|
|||
|
entity knowing the shared secret.
|
|||
|
|
|||
|
Since the HOTP client and the server are synchronized and share the
|
|||
|
same secret (or a method to recompute it), a simple 3-pass protocol
|
|||
|
could be put in place:
|
|||
|
1- The end user enter the TokenID and a first OTP value OTP1;
|
|||
|
2- The server checks OTP1 and if correct, sends back OTP2;
|
|||
|
3- The end user checks OTP2 using his HOTP device and if correct,
|
|||
|
uses the web site.
|
|||
|
|
|||
|
Obviously, as indicated previously, all the OTP communications have
|
|||
|
to take place over a secure channel, e.g., SSL/TLS, IPsec
|
|||
|
connections.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 14]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
10. Conclusion
|
|||
|
|
|||
|
This document describes HOTP, a HMAC-based One-Time Password
|
|||
|
algorithm. It also recommends the preferred implementation and
|
|||
|
related modes of operations for deploying the algorithm.
|
|||
|
|
|||
|
The document also exhibits elements of security and demonstrates that
|
|||
|
the HOTP algorithm is practical and sound, the best possible attack
|
|||
|
being a brute force attack that can be prevented by careful
|
|||
|
implementation of countermeasures in the validation server.
|
|||
|
|
|||
|
Eventually, several enhancements have been proposed, in order to
|
|||
|
improve security if needed for specific applications.
|
|||
|
|
|||
|
11. Acknowledgements
|
|||
|
|
|||
|
The authors would like to thank Siddharth Bajaj, Alex Deacon, Loren
|
|||
|
Hart, and Nico Popp for their help during the conception and
|
|||
|
redaction of this document.
|
|||
|
|
|||
|
12. Contributors
|
|||
|
|
|||
|
The authors of this document would like to emphasize the role of
|
|||
|
three persons who have made a key contribution to this document:
|
|||
|
|
|||
|
- Laszlo Elteto is system architect with SafeNet, Inc.
|
|||
|
|
|||
|
- Ernesto Frutos is director of Engineering with Authenex, Inc.
|
|||
|
|
|||
|
- Fred McClain is Founder and CTO with Boojum Mobile, Inc.
|
|||
|
|
|||
|
Without their advice and valuable inputs, this document would not be
|
|||
|
the same.
|
|||
|
|
|||
|
13. References
|
|||
|
|
|||
|
13.1. Normative References
|
|||
|
|
|||
|
[BCK1] M. Bellare, R. Canetti and H. Krawczyk, "Keyed Hash
|
|||
|
Functions and Message Authentication", Proceedings of
|
|||
|
Crypto'96, LNCS Vol. 1109, pp. 1-15.
|
|||
|
|
|||
|
[BCK2] Krawczyk, H., Bellare, M., and R. Canetti, "HMAC: Keyed-
|
|||
|
Hashing for Message Authentication", RFC 2104, February
|
|||
|
1997.
|
|||
|
|
|||
|
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
|
|||
|
Requirement Levels", BCP 14, RFC 2119, March 1997.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 15]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
[RFC3979] Bradner, S., "Intellectual Property Rights in IETF
|
|||
|
Technology", BCP 79, RFC 3979, March 2005.
|
|||
|
|
|||
|
[RFC4086] Eastlake, D., 3rd, Schiller, J., and S. Crocker,
|
|||
|
"Randomness Requirements for Security", BCP 106, RFC 4086,
|
|||
|
June 2005.
|
|||
|
|
|||
|
13.2. Informative References
|
|||
|
|
|||
|
[OATH] Initiative for Open AuTHentication
|
|||
|
http://www.openauthentication.org
|
|||
|
|
|||
|
[PrOo] B. Preneel and P. van Oorschot, "MD-x MAC and building
|
|||
|
fast MACs from hash functions", Advances in Cryptology
|
|||
|
CRYPTO '95, Lecture Notes in Computer Science Vol. 963, D.
|
|||
|
Coppersmith ed., Springer-Verlag, 1995.
|
|||
|
|
|||
|
[Crack] Crack in SHA-1 code 'stuns' security gurus
|
|||
|
http://www.eetimes.com/showArticle.jhtml?
|
|||
|
articleID=60402150
|
|||
|
|
|||
|
[Sha1] Bruce Schneier. SHA-1 broken. February 15, 2005.
|
|||
|
http://www.schneier.com/blog/archives/2005/02/
|
|||
|
sha1_broken.html
|
|||
|
|
|||
|
[Res] Researchers: Digital encryption standard flawed
|
|||
|
http://news.com.com/
|
|||
|
Researchers+Digital+encryption+standard+flawed/
|
|||
|
2100-1002-5579881.html?part=dht&tag=ntop&tag=nl.e703
|
|||
|
|
|||
|
[Shamir] How to Share a Secret, by Adi Shamir. In Communications
|
|||
|
of the ACM, Vol. 22, No. 11, pp. 612-613, November, 1979.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 16]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
Appendix A - HOTP Algorithm Security: Detailed Analysis
|
|||
|
|
|||
|
The security analysis of the HOTP algorithm is summarized in this
|
|||
|
section. We first detail the best attack strategies, and then
|
|||
|
elaborate on the security under various assumptions and the impact of
|
|||
|
the truncation and make some recommendations regarding the number of
|
|||
|
digits.
|
|||
|
|
|||
|
We focus this analysis on the case where Digit = 6, i.e., an HOTP
|
|||
|
function that produces 6-digit values, which is the bare minimum
|
|||
|
recommended in this document.
|
|||
|
|
|||
|
A.1. Definitions and Notations
|
|||
|
|
|||
|
We denote by {0,1}^l the set of all strings of length l.
|
|||
|
|
|||
|
Let Z_{n} = {0,.., n - 1}.
|
|||
|
|
|||
|
Let IntDiv(a,b) denote the integer division algorithm that takes
|
|||
|
input integers a, b where a >= b >= 1 and returns integers (q,r)
|
|||
|
|
|||
|
the quotient and remainder, respectively, of the division of a by b.
|
|||
|
(Thus, a = bq + r and 0 <= r < b.)
|
|||
|
|
|||
|
Let H: {0,1}^k x {0,1}^c --> {0,1}^n be the base function that takes
|
|||
|
a k-bit key K and c-bit counter C and returns an n-bit output H(K,C).
|
|||
|
(In the case of HOTP, H is HMAC-SHA-1; we use this formal definition
|
|||
|
for generalizing our proof of security.)
|
|||
|
|
|||
|
A.2. The Idealized Algorithm: HOTP-IDEAL
|
|||
|
|
|||
|
We now define an idealized counterpart of the HOTP algorithm. In
|
|||
|
this algorithm, the role of H is played by a random function that
|
|||
|
forms the key.
|
|||
|
|
|||
|
To be more precise, let Maps(c,n) denote the set of all functions
|
|||
|
mapping from {0,1}^c to {0,1}^n. The idealized algorithm has key
|
|||
|
space Maps(c,n), so that a "key" for such an algorithm is a function
|
|||
|
h from {0,1}^c to {0,1}^n. We imagine this key (function) to be
|
|||
|
drawn at random. It is not feasible to implement this idealized
|
|||
|
algorithm, since the key, being a function from {0,1}^c to {0,1}^n,
|
|||
|
is way too large to even store. So why consider it?
|
|||
|
|
|||
|
Our security analysis will show that as long as H satisfies a certain
|
|||
|
well-accepted assumption, the security of the actual and idealized
|
|||
|
algorithms is for all practical purposes the same. The task that
|
|||
|
really faces us, then, is to assess the security of the idealized
|
|||
|
algorithm.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 17]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
In analyzing the idealized algorithm, we are concentrating on
|
|||
|
assessing the quality of the design of the algorithm itself,
|
|||
|
independently of HMAC-SHA-1. This is in fact the important issue.
|
|||
|
|
|||
|
A.3. Model of Security
|
|||
|
|
|||
|
The model exhibits the type of threats or attacks that are being
|
|||
|
considered and enables one to assess the security of HOTP and HOTP-
|
|||
|
IDEAL. We denote ALG as either HOTP or HOTP-IDEAL for the purpose of
|
|||
|
this security analysis.
|
|||
|
|
|||
|
The scenario we are considering is that a user and server share a key
|
|||
|
K for ALG. Both maintain a counter C, initially zero, and the user
|
|||
|
authenticates itself by sending ALG(K,C) to the server. The latter
|
|||
|
accepts if this value is correct.
|
|||
|
|
|||
|
In order to protect against accidental increment of the user counter,
|
|||
|
the server, upon receiving a value z, will accept as long as z equals
|
|||
|
ALG(K,i) for some i in the range C,...,C + s-1, where s is the
|
|||
|
resynchronization parameter and C is the server counter. If it
|
|||
|
accepts with some value of i, it then increments its counter to i+1.
|
|||
|
If it does not accept, it does not change its counter value.
|
|||
|
|
|||
|
The model we specify captures what an adversary can do and what it
|
|||
|
needs to achieve in order to "win". First, the adversary is assumed
|
|||
|
to be able to eavesdrop, meaning, to see the authenticator
|
|||
|
transmitted by the user. Second, the adversary wins if it can get
|
|||
|
the server to accept an authenticator relative to a counter value for
|
|||
|
which the user has never transmitted an authenticator.
|
|||
|
|
|||
|
The formal adversary, which we denote by B, starts out knowing which
|
|||
|
algorithm ALG is being used, knowing the system design, and knowing
|
|||
|
all system parameters. The one and only thing it is not given a
|
|||
|
priori is the key K shared between the user and the server.
|
|||
|
|
|||
|
The model gives B full control of the scheduling of events. It has
|
|||
|
access to an authenticator oracle representing the user. By calling
|
|||
|
this oracle, the adversary can ask the user to authenticate itself
|
|||
|
and get back the authenticator in return. It can call this oracle as
|
|||
|
often as it wants and when it wants, using the authenticators it
|
|||
|
accumulates to perhaps "learn" how to make authenticators itself. At
|
|||
|
any time, it may also call a verification oracle, supplying the
|
|||
|
latter with a candidate authenticator of its choice. It wins if the
|
|||
|
server accepts this accumulator.
|
|||
|
|
|||
|
Consider the following game involving an adversary B that is
|
|||
|
attempting to compromise the security of an authentication algorithm
|
|||
|
ALG: K x {0,1}^c --> R.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 18]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
Initializations - A key K is selected at random from K, a counter C
|
|||
|
is initialized to 0, and the Boolean value win is set to false.
|
|||
|
|
|||
|
Game execution - Adversary B is provided with the two following
|
|||
|
oracles:
|
|||
|
|
|||
|
Oracle AuthO()
|
|||
|
--------------
|
|||
|
A = ALG(K,C)
|
|||
|
C = C + 1
|
|||
|
Return O to B
|
|||
|
|
|||
|
Oracle VerO(A)
|
|||
|
--------------
|
|||
|
i = C
|
|||
|
While (i <= C + s - 1 and Win == FALSE) do
|
|||
|
If A == ALG(K,i) then Win = TRUE; C = i + 1
|
|||
|
Else i = i + 1
|
|||
|
Return Win to B
|
|||
|
|
|||
|
AuthO() is the authenticator oracle and VerO(A) is the verification
|
|||
|
oracle.
|
|||
|
|
|||
|
Upon execution, B queries the two oracles at will. Let Adv(B) be the
|
|||
|
probability that win gets set to true in the above game. This is the
|
|||
|
probability that the adversary successfully impersonates the user.
|
|||
|
|
|||
|
Our goal is to assess how large this value can be as a function of
|
|||
|
the number v of verification queries made by B, the number a of
|
|||
|
authenticator oracle queries made by B, and the running time t of B.
|
|||
|
This will tell us how to set the throttle, which effectively upper
|
|||
|
bounds v.
|
|||
|
|
|||
|
A.4. Security of the Ideal Authentication Algorithm
|
|||
|
|
|||
|
This section summarizes the security analysis of HOTP-IDEAL, starting
|
|||
|
with the impact of the conversion modulo 10^Digit and then focusing
|
|||
|
on the different possible attacks.
|
|||
|
|
|||
|
A.4.1. From Bits to Digits
|
|||
|
|
|||
|
The dynamic offset truncation of a random n-bit string yields a
|
|||
|
random 31-bit string. What happens to the distribution when it is
|
|||
|
taken modulo m = 10^Digit, as done in HOTP?
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 19]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
The following lemma estimates the biases in the outputs in this case.
|
|||
|
|
|||
|
Lemma 1
|
|||
|
-------
|
|||
|
Let N >= m >= 1 be integers, and let (q,r) = IntDiv(N,m). For z in
|
|||
|
Z_{m} let:
|
|||
|
|
|||
|
P_{N,m}(z) = Pr [x mod m = z : x randomly pick in Z_{n}]
|
|||
|
|
|||
|
Then for any z in Z_{m}
|
|||
|
|
|||
|
P_{N,m}(z) = (q + 1) / N if 0 <= z < r
|
|||
|
q / N if r <= z < m
|
|||
|
|
|||
|
Proof of Lemma 1
|
|||
|
----------------
|
|||
|
Let the random variable X be uniformly distributed over Z_{N}. Then:
|
|||
|
|
|||
|
P_{N,m}(z) = Pr [X mod m = z]
|
|||
|
|
|||
|
= Pr [X < mq] * Pr [X mod m = z| X < mq]
|
|||
|
+ Pr [mq <= X < N] * Pr [X mod m = z| mq <= X < N]
|
|||
|
|
|||
|
= mq/N * 1/m +
|
|||
|
(N - mq)/N * 1 / (N - mq) if 0 <= z < N - mq
|
|||
|
0 if N - mq <= z <= m
|
|||
|
|
|||
|
= q/N +
|
|||
|
r/N * 1 / r if 0 <= z < N - mq
|
|||
|
0 if r <= z <= m
|
|||
|
|
|||
|
Simplifying yields the claimed equation.
|
|||
|
|
|||
|
Let N = 2^31, d = 6, and m = 10^d. If x is chosen at random from
|
|||
|
Z_{N} (meaning, is a random 31-bit string), then reducing it to a 6-
|
|||
|
digit number by taking x mod m does not yield a random 6-digit
|
|||
|
number.
|
|||
|
|
|||
|
Rather, x mod m is distributed as shown in the following table:
|
|||
|
|
|||
|
Values Probability that each appears as output
|
|||
|
----------------------------------------------------------------
|
|||
|
0,1,...,483647 2148/2^31 roughly equals to 1.00024045/10^6
|
|||
|
483648,...,999999 2147/2^31 roughly equals to 0.99977478/10^6
|
|||
|
|
|||
|
If X is uniformly distributed over Z_{2^31} (meaning, is a random
|
|||
|
31-bit string), then the above shows the probabilities for different
|
|||
|
outputs of X mod 10^6. The first set of values appears with
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 20]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
probability slightly greater than 10^-6, the rest with probability
|
|||
|
slightly less, meaning that the distribution is slightly non-uniform.
|
|||
|
|
|||
|
However, as the table above indicates, the bias is small, and as we
|
|||
|
will see later, negligible: the probabilities are very close to
|
|||
|
10^-6.
|
|||
|
|
|||
|
A.4.2. Brute Force Attacks
|
|||
|
|
|||
|
If the authenticator consisted of d random digits, then a brute force
|
|||
|
attack using v verification attempts would succeed with probability
|
|||
|
sv/10^Digit.
|
|||
|
|
|||
|
However, an adversary can exploit the bias in the outputs of
|
|||
|
HOTP-IDEAL, predicted by Lemma 1, to mount a slightly better attack.
|
|||
|
|
|||
|
Namely, it makes authentication attempts with authenticators that are
|
|||
|
the most likely values, meaning the ones in the range 0,...,r - 1,
|
|||
|
where (q,r) = IntDiv(2^31,10^Digit).
|
|||
|
|
|||
|
The following specifies an adversary in our model of security that
|
|||
|
mounts the attack. It estimates the success probability as a
|
|||
|
function of the number of verification queries.
|
|||
|
|
|||
|
For simplicity, we assume that the number of verification queries is
|
|||
|
at most r. With N = 2^31 and m = 10^6, we have r = 483,648, and the
|
|||
|
throttle value is certainly less than this, so this assumption is not
|
|||
|
much of a restriction.
|
|||
|
|
|||
|
Proposition 1
|
|||
|
-------------
|
|||
|
|
|||
|
Suppose m = 10^Digit < 2^31, and let (q,r) = IntDiv(2^31,m). Assume
|
|||
|
s <= m. The brute-force-attack adversary B-bf attacks HOTP using v
|
|||
|
<= r verification oracle queries. This adversary makes no
|
|||
|
authenticator oracle queries, and succeeds with probability
|
|||
|
|
|||
|
Adv(B-bf) = 1 - (1 - v(q+1)/2^31)^s
|
|||
|
|
|||
|
which is roughly equal to
|
|||
|
|
|||
|
sv * (q+1)/2^31
|
|||
|
|
|||
|
With m = 10^6 we get q = 2,147. In that case, the brute force attack
|
|||
|
using v verification attempts succeeds with probability
|
|||
|
|
|||
|
Adv(B-bf) roughly = sv * 2148/2^31 = sv * 1.00024045/10^6
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 21]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
As this equation shows, the resynchronization parameter s has a
|
|||
|
significant impact in that the adversary's success probability is
|
|||
|
proportional to s. This means that s cannot be made too large
|
|||
|
without compromising security.
|
|||
|
|
|||
|
A.4.3. Brute force attacks are the best possible attacks.
|
|||
|
|
|||
|
A central question is whether there are attacks any better than the
|
|||
|
brute force one. In particular, the brute force attack did not
|
|||
|
attempt to collect authenticators sent by the user and try to
|
|||
|
cryptanalyze them in an attempt to learn how to better construct
|
|||
|
authenticators. Would doing this help? Is there some way to "learn"
|
|||
|
how to build authenticators that result in a higher success rate than
|
|||
|
given by the brute-force attack?
|
|||
|
|
|||
|
The following says the answer to these questions is no. No matter
|
|||
|
what strategy the adversary uses, and even if it sees, and tries to
|
|||
|
exploit, the authenticators from authentication attempts of the user,
|
|||
|
its success probability will not be above that of the brute force
|
|||
|
attack -- this is true as long as the number of authentications it
|
|||
|
observes is not incredibly large. This is valuable information
|
|||
|
regarding the security of the scheme.
|
|||
|
|
|||
|
Proposition 2 ------------- Suppose m = 10^Digit < 2^31, and let
|
|||
|
(q,r) = IntDiv(2^31,m). Let B be any adversary attacking HOTP-IDEAL
|
|||
|
using v verification oracle queries and a <= 2^c - s authenticator
|
|||
|
oracle queries. Then
|
|||
|
|
|||
|
Adv(B) < = sv * (q+1)/ 2^31
|
|||
|
|
|||
|
Note: This result is conditional on the adversary not seeing more
|
|||
|
than 2^c - s authentications performed by the user, which is hardly
|
|||
|
restrictive as long as c is large enough.
|
|||
|
|
|||
|
With m = 10^6, we get q = 2,147. In that case, Proposition 2 says
|
|||
|
that any adversary B attacking HOTP-IDEAL and making v verification
|
|||
|
attempts succeeds with probability at most
|
|||
|
|
|||
|
Equation 1
|
|||
|
----------
|
|||
|
sv * 2148/2^31 roughly = sv * 1.00024045/10^6
|
|||
|
|
|||
|
Meaning, B's success rate is not more than that achieved by the brute
|
|||
|
force attack.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 22]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
A.5. Security Analysis of HOTP
|
|||
|
|
|||
|
We have analyzed, in the previous sections, the security of the
|
|||
|
idealized counterparts HOTP-IDEAL of the actual authentication
|
|||
|
algorithm HOTP. We now show that, under appropriate and well-
|
|||
|
believed assumption on H, the security of the actual algorithms is
|
|||
|
essentially the same as that of its idealized counterpart.
|
|||
|
|
|||
|
The assumption in question is that H is a secure pseudorandom
|
|||
|
function, or PRF, meaning that its input-output values are
|
|||
|
indistinguishable from those of a random function in practice.
|
|||
|
|
|||
|
Consider an adversary A that is given an oracle for a function f:
|
|||
|
{0,1}^c --> {0, 1}^n and eventually outputs a bit. We denote Adv(A)
|
|||
|
as the prf-advantage of A, which represents how well the adversary
|
|||
|
does at distinguishing the case where its oracle is H(K,.) from the
|
|||
|
case where its oracle is a random function of {0,1}^c to {0,1}^n.
|
|||
|
|
|||
|
One possible attack is based on exhaustive search for the key K. If
|
|||
|
A runs for t steps and T denotes the time to perform one computation
|
|||
|
of H, its prf-advantage from this attack turns out to be (t/T)2^-k.
|
|||
|
Another possible attack is a birthday one [PrOo], whereby A can
|
|||
|
attain advantage p^2/2^n in p oracle queries and running time about
|
|||
|
pT.
|
|||
|
|
|||
|
Our assumption is that these are the best possible attacks. This
|
|||
|
translates into the following.
|
|||
|
|
|||
|
Assumption 1
|
|||
|
------------
|
|||
|
|
|||
|
Let T denotes the time to perform one computation of H. Then if A is
|
|||
|
any adversary with running time at most t and making at most p oracle
|
|||
|
queries,
|
|||
|
|
|||
|
Adv(A) <= (t/T)/2^k + p^2/2^n
|
|||
|
|
|||
|
In practice, this assumption means that H is very secure as PRF. For
|
|||
|
example, given that k = n = 160, an attacker with running time 2^60
|
|||
|
and making 2^40 oracle queries has advantage at most (about) 2^-80.
|
|||
|
|
|||
|
Theorem 1
|
|||
|
---------
|
|||
|
|
|||
|
Suppose m = 10^Digit < 2^31, and let (q,r) = IntDiv(2^31,m). Let B
|
|||
|
be any adversary attacking HOTP using v verification oracle queries,
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 23]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
a <= 2^c - s authenticator oracle queries, and running time t. Let T
|
|||
|
denote the time to perform one computation of H. If Assumption 1 is
|
|||
|
true, then
|
|||
|
|
|||
|
Adv(B) <= sv * (q + 1)/2^31 + (t/T)/2^k + ((sv + a)^2)/2^n
|
|||
|
|
|||
|
In practice, the (t/T)2^-k + ((sv + a)^2)2^-n term is much smaller
|
|||
|
than the sv(q + 1)/2^n term, so that the above says that for all
|
|||
|
practical purposes the success rate of an adversary attacking HOTP is
|
|||
|
sv(q + 1)/2^n, just as for HOTP-IDEAL, meaning the HOTP algorithm is
|
|||
|
in practice essentially as good as its idealized counterpart.
|
|||
|
|
|||
|
In the case m = 10^6 of a 6-digit output, this means that an
|
|||
|
adversary making v authentication attempts will have a success rate
|
|||
|
that is at most that of Equation 1.
|
|||
|
|
|||
|
For example, consider an adversary with running time at most 2^60
|
|||
|
that sees at most 2^40 authentication attempts of the user. Both
|
|||
|
these choices are very generous to the adversary, who will typically
|
|||
|
not have these resources, but we are saying that even such a powerful
|
|||
|
adversary will not have more success than indicated by Equation 1.
|
|||
|
|
|||
|
We can safely assume sv <= 2^40 due to the throttling and bounds on
|
|||
|
s. So:
|
|||
|
|
|||
|
(t/T)/2^k + ((sv + a)^2)/2^n <= 2^60/2^160 + (2^41)^2/2^160
|
|||
|
roughly <= 2^-78
|
|||
|
|
|||
|
which is much smaller than the success probability of Equation 1 and
|
|||
|
negligible compared to it.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 24]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
Appendix B - SHA-1 Attacks
|
|||
|
|
|||
|
This sections addresses the impact of the recent attacks on SHA-1 on
|
|||
|
the security of the HMAC-SHA-1-based HOTP. We begin with some
|
|||
|
discussion of the situation of SHA-1 and then discuss the relevance
|
|||
|
to HMAC-SHA-1 and HOTP. Cited references are in Section 13.
|
|||
|
|
|||
|
B.1. SHA-1 Status
|
|||
|
|
|||
|
A collision for a hash function h means a pair x,y of different
|
|||
|
inputs such that h(x)=h(y). Since SHA-1 outputs 160 bits, a birthday
|
|||
|
attack finds a collision in 2^{80} trials. (A trial means one
|
|||
|
computation of the function.) This was thought to be the best
|
|||
|
possible until Wang, Yin, and Yu announced on February 15, 2005, that
|
|||
|
they had an attack finding collisions in 2^{69} trials.
|
|||
|
|
|||
|
Is SHA-1 broken? For most practical purposes, we would say probably
|
|||
|
not, since the resources needed to mount the attack are huge. Here
|
|||
|
is one way to get a sense of it: we can estimate it is about the same
|
|||
|
as the time we would need to factor a 760-bit RSA modulus, and this
|
|||
|
is currently considered out of reach.
|
|||
|
|
|||
|
Burr of NIST is quoted in [Crack] as saying "Large national
|
|||
|
intelligence agencies could do this in a reasonable amount of time
|
|||
|
with a few million dollars in computer time". However, the
|
|||
|
computation may be out of reach of all but such well-funded agencies.
|
|||
|
|
|||
|
One should also ask what impact finding SHA-1 collisions actually has
|
|||
|
on security of real applications such as signatures. To exploit a
|
|||
|
collision x,y to forge signatures, you need to somehow obtain a
|
|||
|
signature of x and then you can forge a signature of y. How damaging
|
|||
|
this is depends on the content of y: the y created by the attack may
|
|||
|
not be meaningful in the application context. Also, one needs a
|
|||
|
chosen-message attack to get the signature of x. This seems possible
|
|||
|
in some contexts, but not others. Overall, it is not clear that the
|
|||
|
impact on the security of signatures is significant.
|
|||
|
|
|||
|
Indeed, one can read in the press that SHA-1 is "broken" [Sha1] and
|
|||
|
that encryption and SSL are "broken" [Res]. The media have a
|
|||
|
tendency to magnify events: it would hardly be interesting to
|
|||
|
announce in the news that a team of cryptanalysts did very
|
|||
|
interesting theoretical work in attacking SHA-1.
|
|||
|
|
|||
|
Cryptographers are excited too. But mainly because this is an
|
|||
|
important theoretical breakthrough. Attacks can only get better with
|
|||
|
time: it is therefore important to monitor any progress in hash
|
|||
|
functions cryptanalysis and be prepared for any really practical
|
|||
|
break with a sound migration plan for the future.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 25]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
B.2. HMAC-SHA-1 Status
|
|||
|
|
|||
|
The new attacks on SHA-1 have no impact on the security of
|
|||
|
HMAC-SHA-1. The best attack on the latter remains one needing a
|
|||
|
sender to authenticate 2^{80} messages before an adversary can create
|
|||
|
a forgery. Why?
|
|||
|
|
|||
|
HMAC is not a hash function. It is a message authentication code
|
|||
|
(MAC) that uses a hash function internally. A MAC depends on a
|
|||
|
secret key, while hash functions don't. What one needs to worry
|
|||
|
about with a MAC is forgery, not collisions. HMAC was designed so
|
|||
|
that collisions in the hash function (here SHA-1) do not yield
|
|||
|
forgeries for HMAC.
|
|||
|
|
|||
|
Recall that HMAC-SHA-1(K,x) = SHA-1(K_o,SHA-1(K_i,x)) where the keys
|
|||
|
K_o,K_i are derived from K. Suppose the attacker finds a pair x,y
|
|||
|
such that SHA-1(K_i,x) = SHA-1(K_i,y). (Call this a hidden-key
|
|||
|
collision.) Then if it can obtain the MAC of x (itself a tall
|
|||
|
order), it can forge the MAC of y. (These values are the same.) But
|
|||
|
finding hidden-key collisions is harder than finding collisions,
|
|||
|
because the attacker does not know the hidden key K_i. All it may
|
|||
|
have is some outputs of HMAC-SHA-1 with key K. To date, there are no
|
|||
|
claims or evidence that the recent attacks on SHA-1 extend to find
|
|||
|
hidden-key collisions.
|
|||
|
|
|||
|
Historically, the HMAC design has already proven itself in this
|
|||
|
regard. MD5 is considered broken in that collisions in this hash
|
|||
|
function can be found relatively easily. But there is still no
|
|||
|
attack on HMAC-MD5 better than the trivial 2^{64} time birthday one.
|
|||
|
(MD5 outputs 128 bits, not 160.) We are seeing this strength of HMAC
|
|||
|
coming into play again in the SHA-1 context.
|
|||
|
|
|||
|
B.3. HOTP Status
|
|||
|
|
|||
|
Since no new weakness has surfaced in HMAC-SHA-1, there is no impact
|
|||
|
on HOTP. The best attacks on HOTP remain those described in the
|
|||
|
document, namely, to try to guess output values.
|
|||
|
|
|||
|
The security proof of HOTP requires that HMAC-SHA-1 behave like a
|
|||
|
pseudorandom function. The quality of HMAC-SHA-1 as a pseudorandom
|
|||
|
function is not impacted by the new attacks on SHA-1, and so neither
|
|||
|
is this proven guarantee.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 26]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
Appendix C - HOTP Algorithm: Reference Implementation
|
|||
|
|
|||
|
/*
|
|||
|
* OneTimePasswordAlgorithm.java
|
|||
|
* OATH Initiative,
|
|||
|
* HOTP one-time password algorithm
|
|||
|
*
|
|||
|
*/
|
|||
|
|
|||
|
/* Copyright (C) 2004, OATH. All rights reserved.
|
|||
|
*
|
|||
|
* License to copy and use this software is granted provided that it
|
|||
|
* is identified as the "OATH HOTP Algorithm" in all material
|
|||
|
* mentioning or referencing this software or this function.
|
|||
|
*
|
|||
|
* License is also granted to make and use derivative works provided
|
|||
|
* that such works are identified as
|
|||
|
* "derived from OATH HOTP algorithm"
|
|||
|
* in all material mentioning or referencing the derived work.
|
|||
|
*
|
|||
|
* OATH (Open AuTHentication) and its members make no
|
|||
|
* representations concerning either the merchantability of this
|
|||
|
* software or the suitability of this software for any particular
|
|||
|
* purpose.
|
|||
|
*
|
|||
|
* It is provided "as is" without express or implied warranty
|
|||
|
* of any kind and OATH AND ITS MEMBERS EXPRESSaLY DISCLAIMS
|
|||
|
* ANY WARRANTY OR LIABILITY OF ANY KIND relating to this software.
|
|||
|
*
|
|||
|
* These notices must be retained in any copies of any part of this
|
|||
|
* documentation and/or software.
|
|||
|
*/
|
|||
|
|
|||
|
package org.openauthentication.otp;
|
|||
|
|
|||
|
import java.io.IOException;
|
|||
|
import java.io.File;
|
|||
|
import java.io.DataInputStream;
|
|||
|
import java.io.FileInputStream ;
|
|||
|
import java.lang.reflect.UndeclaredThrowableException;
|
|||
|
|
|||
|
import java.security.GeneralSecurityException;
|
|||
|
import java.security.NoSuchAlgorithmException;
|
|||
|
import java.security.InvalidKeyException;
|
|||
|
|
|||
|
import javax.crypto.Mac;
|
|||
|
import javax.crypto.spec.SecretKeySpec;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 27]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
/**
|
|||
|
* This class contains static methods that are used to calculate the
|
|||
|
* One-Time Password (OTP) using
|
|||
|
* JCE to provide the HMAC-SHA-1.
|
|||
|
*
|
|||
|
* @author Loren Hart
|
|||
|
* @version 1.0
|
|||
|
*/
|
|||
|
public class OneTimePasswordAlgorithm {
|
|||
|
private OneTimePasswordAlgorithm() {}
|
|||
|
|
|||
|
// These are used to calculate the check-sum digits.
|
|||
|
// 0 1 2 3 4 5 6 7 8 9
|
|||
|
private static final int[] doubleDigits =
|
|||
|
{ 0, 2, 4, 6, 8, 1, 3, 5, 7, 9 };
|
|||
|
|
|||
|
/**
|
|||
|
* Calculates the checksum using the credit card algorithm.
|
|||
|
* This algorithm has the advantage that it detects any single
|
|||
|
* mistyped digit and any single transposition of
|
|||
|
* adjacent digits.
|
|||
|
*
|
|||
|
* @param num the number to calculate the checksum for
|
|||
|
* @param digits number of significant places in the number
|
|||
|
*
|
|||
|
* @return the checksum of num
|
|||
|
*/
|
|||
|
public static int calcChecksum(long num, int digits) {
|
|||
|
boolean doubleDigit = true;
|
|||
|
int total = 0;
|
|||
|
while (0 < digits--) {
|
|||
|
int digit = (int) (num % 10);
|
|||
|
num /= 10;
|
|||
|
if (doubleDigit) {
|
|||
|
digit = doubleDigits[digit];
|
|||
|
}
|
|||
|
total += digit;
|
|||
|
doubleDigit = !doubleDigit;
|
|||
|
}
|
|||
|
int result = total % 10;
|
|||
|
if (result > 0) {
|
|||
|
result = 10 - result;
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* This method uses the JCE to provide the HMAC-SHA-1
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 28]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
* algorithm.
|
|||
|
* HMAC computes a Hashed Message Authentication Code and
|
|||
|
* in this case SHA1 is the hash algorithm used.
|
|||
|
*
|
|||
|
* @param keyBytes the bytes to use for the HMAC-SHA-1 key
|
|||
|
* @param text the message or text to be authenticated.
|
|||
|
*
|
|||
|
* @throws NoSuchAlgorithmException if no provider makes
|
|||
|
* either HmacSHA1 or HMAC-SHA-1
|
|||
|
* digest algorithms available.
|
|||
|
* @throws InvalidKeyException
|
|||
|
* The secret provided was not a valid HMAC-SHA-1 key.
|
|||
|
*
|
|||
|
*/
|
|||
|
|
|||
|
public static byte[] hmac_sha1(byte[] keyBytes, byte[] text)
|
|||
|
throws NoSuchAlgorithmException, InvalidKeyException
|
|||
|
{
|
|||
|
// try {
|
|||
|
Mac hmacSha1;
|
|||
|
try {
|
|||
|
hmacSha1 = Mac.getInstance("HmacSHA1");
|
|||
|
} catch (NoSuchAlgorithmException nsae) {
|
|||
|
hmacSha1 = Mac.getInstance("HMAC-SHA-1");
|
|||
|
}
|
|||
|
SecretKeySpec macKey =
|
|||
|
new SecretKeySpec(keyBytes, "RAW");
|
|||
|
hmacSha1.init(macKey);
|
|||
|
return hmacSha1.doFinal(text);
|
|||
|
// } catch (GeneralSecurityException gse) {
|
|||
|
// throw new UndeclaredThrowableException(gse);
|
|||
|
// }
|
|||
|
}
|
|||
|
|
|||
|
private static final int[] DIGITS_POWER
|
|||
|
// 0 1 2 3 4 5 6 7 8
|
|||
|
= {1,10,100,1000,10000,100000,1000000,10000000,100000000};
|
|||
|
|
|||
|
/**
|
|||
|
* This method generates an OTP value for the given
|
|||
|
* set of parameters.
|
|||
|
*
|
|||
|
* @param secret the shared secret
|
|||
|
* @param movingFactor the counter, time, or other value that
|
|||
|
* changes on a per use basis.
|
|||
|
* @param codeDigits the number of digits in the OTP, not
|
|||
|
* including the checksum, if any.
|
|||
|
* @param addChecksum a flag that indicates if a checksum digit
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 29]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
* should be appended to the OTP.
|
|||
|
* @param truncationOffset the offset into the MAC result to
|
|||
|
* begin truncation. If this value is out of
|
|||
|
* the range of 0 ... 15, then dynamic
|
|||
|
* truncation will be used.
|
|||
|
* Dynamic truncation is when the last 4
|
|||
|
* bits of the last byte of the MAC are
|
|||
|
* used to determine the start offset.
|
|||
|
* @throws NoSuchAlgorithmException if no provider makes
|
|||
|
* either HmacSHA1 or HMAC-SHA-1
|
|||
|
* digest algorithms available.
|
|||
|
* @throws InvalidKeyException
|
|||
|
* The secret provided was not
|
|||
|
* a valid HMAC-SHA-1 key.
|
|||
|
*
|
|||
|
* @return A numeric String in base 10 that includes
|
|||
|
* {@link codeDigits} digits plus the optional checksum
|
|||
|
* digit if requested.
|
|||
|
*/
|
|||
|
static public String generateOTP(byte[] secret,
|
|||
|
long movingFactor,
|
|||
|
int codeDigits,
|
|||
|
boolean addChecksum,
|
|||
|
int truncationOffset)
|
|||
|
throws NoSuchAlgorithmException, InvalidKeyException
|
|||
|
{
|
|||
|
// put movingFactor value into text byte array
|
|||
|
String result = null;
|
|||
|
int digits = addChecksum ? (codeDigits + 1) : codeDigits;
|
|||
|
byte[] text = new byte[8];
|
|||
|
for (int i = text.length - 1; i >= 0; i--) {
|
|||
|
text[i] = (byte) (movingFactor & 0xff);
|
|||
|
movingFactor >>= 8;
|
|||
|
}
|
|||
|
|
|||
|
// compute hmac hash
|
|||
|
byte[] hash = hmac_sha1(secret, text);
|
|||
|
|
|||
|
// put selected bytes into result int
|
|||
|
int offset = hash[hash.length - 1] & 0xf;
|
|||
|
if ( (0<=truncationOffset) &&
|
|||
|
(truncationOffset<(hash.length-4)) ) {
|
|||
|
offset = truncationOffset;
|
|||
|
}
|
|||
|
int binary =
|
|||
|
((hash[offset] & 0x7f) << 24)
|
|||
|
| ((hash[offset + 1] & 0xff) << 16)
|
|||
|
| ((hash[offset + 2] & 0xff) << 8)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 30]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
| (hash[offset + 3] & 0xff);
|
|||
|
|
|||
|
int otp = binary % DIGITS_POWER[codeDigits];
|
|||
|
if (addChecksum) {
|
|||
|
otp = (otp * 10) + calcChecksum(otp, codeDigits);
|
|||
|
}
|
|||
|
result = Integer.toString(otp);
|
|||
|
while (result.length() < digits) {
|
|||
|
result = "0" + result;
|
|||
|
}
|
|||
|
return result;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 31]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
Appendix D - HOTP Algorithm: Test Values
|
|||
|
|
|||
|
The following test data uses the ASCII string
|
|||
|
"12345678901234567890" for the secret:
|
|||
|
|
|||
|
Secret = 0x3132333435363738393031323334353637383930
|
|||
|
|
|||
|
Table 1 details for each count, the intermediate HMAC value.
|
|||
|
|
|||
|
Count Hexadecimal HMAC-SHA-1(secret, count)
|
|||
|
0 cc93cf18508d94934c64b65d8ba7667fb7cde4b0
|
|||
|
1 75a48a19d4cbe100644e8ac1397eea747a2d33ab
|
|||
|
2 0bacb7fa082fef30782211938bc1c5e70416ff44
|
|||
|
3 66c28227d03a2d5529262ff016a1e6ef76557ece
|
|||
|
4 a904c900a64b35909874b33e61c5938a8e15ed1c
|
|||
|
5 a37e783d7b7233c083d4f62926c7a25f238d0316
|
|||
|
6 bc9cd28561042c83f219324d3c607256c03272ae
|
|||
|
7 a4fb960c0bc06e1eabb804e5b397cdc4b45596fa
|
|||
|
8 1b3c89f65e6c9e883012052823443f048b4332db
|
|||
|
9 1637409809a679dc698207310c8c7fc07290d9e5
|
|||
|
|
|||
|
Table 2 details for each count the truncated values (both in
|
|||
|
hexadecimal and decimal) and then the HOTP value.
|
|||
|
|
|||
|
Truncated
|
|||
|
Count Hexadecimal Decimal HOTP
|
|||
|
0 4c93cf18 1284755224 755224
|
|||
|
1 41397eea 1094287082 287082
|
|||
|
2 82fef30 137359152 359152
|
|||
|
3 66ef7655 1726969429 969429
|
|||
|
4 61c5938a 1640338314 338314
|
|||
|
5 33c083d4 868254676 254676
|
|||
|
6 7256c032 1918287922 287922
|
|||
|
7 4e5b397 82162583 162583
|
|||
|
8 2823443f 673399871 399871
|
|||
|
9 2679dc69 645520489 520489
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 32]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
Appendix E - Extensions
|
|||
|
|
|||
|
|
|||
|
We introduce in this section several enhancements to the HOTP
|
|||
|
algorithm. These are not recommended extensions or part of the
|
|||
|
standard algorithm, but merely variations that could be used for
|
|||
|
customized implementations.
|
|||
|
|
|||
|
E.1. Number of Digits
|
|||
|
|
|||
|
A simple enhancement in terms of security would be to extract more
|
|||
|
digits from the HMAC-SHA-1 value.
|
|||
|
|
|||
|
For instance, calculating the HOTP value modulo 10^8 to build an 8-
|
|||
|
digit HOTP value would reduce the probability of success of the
|
|||
|
adversary from sv/10^6 to sv/10^8.
|
|||
|
|
|||
|
This could give the opportunity to improve usability, e.g., by
|
|||
|
increasing T and/or s, while still achieving a better security
|
|||
|
overall. For instance, s = 10 and 10v/10^8 = v/10^7 < v/10^6 which
|
|||
|
is the theoretical optimum for 6-digit code when s = 1.
|
|||
|
|
|||
|
E.2. Alphanumeric Values
|
|||
|
|
|||
|
Another option is to use A-Z and 0-9 values; or rather a subset of 32
|
|||
|
symbols taken from the alphanumerical alphabet in order to avoid any
|
|||
|
confusion between characters: 0, O, and Q as well as l, 1, and I are
|
|||
|
very similar, and can look the same on a small display.
|
|||
|
|
|||
|
The immediate consequence is that the security is now in the order of
|
|||
|
sv/32^6 for a 6-digit HOTP value and sv/32^8 for an 8-digit HOTP
|
|||
|
value.
|
|||
|
|
|||
|
32^6 > 10^9 so the security of a 6-alphanumeric HOTP code is slightly
|
|||
|
better than a 9-digit HOTP value, which is the maximum length of an
|
|||
|
HOTP code supported by the proposed algorithm.
|
|||
|
|
|||
|
32^8 > 10^12 so the security of an 8-alphanumeric HOTP code is
|
|||
|
significantly better than a 9-digit HOTP value.
|
|||
|
|
|||
|
Depending on the application and token/interface used for displaying
|
|||
|
and entering the HOTP value, the choice of alphanumeric values could
|
|||
|
be a simple and efficient way to improve security at a reduced cost
|
|||
|
and impact on users.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 33]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
E.3. Sequence of HOTP Values
|
|||
|
|
|||
|
As we suggested for the resynchronization to enter a short sequence
|
|||
|
(say, 2 or 3) of HOTP values, we could generalize the concept to the
|
|||
|
protocol, and add a parameter L that would define the length of the
|
|||
|
HOTP sequence to enter.
|
|||
|
|
|||
|
Per default, the value L SHOULD be set to 1, but if security needs to
|
|||
|
be increased, users might be asked (possibly for a short period of
|
|||
|
time, or a specific operation) to enter L HOTP values.
|
|||
|
|
|||
|
This is another way, without increasing the HOTP length or using
|
|||
|
alphanumeric values to tighten security.
|
|||
|
|
|||
|
Note: The system MAY also be programmed to request synchronization on
|
|||
|
a regular basis (e.g., every night, twice a week, etc.) and to
|
|||
|
achieve this purpose, ask for a sequence of L HOTP values.
|
|||
|
|
|||
|
E.4. A Counter-Based Resynchronization Method
|
|||
|
|
|||
|
In this case, we assume that the client can access and send not only
|
|||
|
the HOTP value but also other information, more specifically, the
|
|||
|
counter value.
|
|||
|
|
|||
|
A more efficient and secure method for resynchronization is possible
|
|||
|
in this case. The client application will not send the HOTP-client
|
|||
|
value only, but the HOTP-client and the related C-client counter
|
|||
|
value, the HOTP value acting as a message authentication code of the
|
|||
|
counter.
|
|||
|
|
|||
|
Resynchronization Counter-based Protocol (RCP)
|
|||
|
----------------------------------------------
|
|||
|
|
|||
|
The server accepts if the following are all true, where C-server is
|
|||
|
its own current counter value:
|
|||
|
|
|||
|
1) C-client >= C-server
|
|||
|
2) C-client - C-server <= s
|
|||
|
3) Check that HOTP client is valid HOTP(K,C-Client)
|
|||
|
4) If true, the server sets C to C-client + 1 and client is
|
|||
|
authenticated
|
|||
|
|
|||
|
In this case, there is no need for managing a look-ahead window
|
|||
|
anymore. The probability of success of the adversary is only v/10^6
|
|||
|
or roughly v in one million. A side benefit is obviously to be able
|
|||
|
to increase s "infinitely" and therefore improve the system usability
|
|||
|
without impacting the security.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 34]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
This resynchronization protocol SHOULD be used whenever the related
|
|||
|
impact on the client and server applications is deemed acceptable.
|
|||
|
|
|||
|
E.5. Data Field
|
|||
|
|
|||
|
Another interesting option is the introduction of a Data field, which
|
|||
|
would be used for generating the One-Time Password values: HOTP (K,
|
|||
|
C, [Data]) where Data is an optional field that can be the
|
|||
|
concatenation of various pieces of identity-related information,
|
|||
|
e.g., Data = Address | PIN.
|
|||
|
|
|||
|
We could also use a Timer, either as the only moving factor or in
|
|||
|
combination with the Counter -- in this case, e.g., Data = Timer,
|
|||
|
where Timer could be the UNIX-time (GMT seconds since 1/1/1970)
|
|||
|
divided by some factor (8, 16, 32, etc.) in order to give a specific
|
|||
|
time step. The time window for the One-Time Password is then equal
|
|||
|
to the time step multiplied by the resynchronization parameter as
|
|||
|
defined before. For example, if we take 64 seconds as the time step
|
|||
|
and 7 for the resynchronization parameter, we obtain an acceptance
|
|||
|
window of +/- 3 minutes.
|
|||
|
|
|||
|
Using a Data field opens for more flexibility in the algorithm
|
|||
|
implementation, provided that the Data field is clearly specified.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 35]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
Authors' Addresses
|
|||
|
|
|||
|
David M'Raihi (primary contact for sending comments and questions)
|
|||
|
VeriSign, Inc.
|
|||
|
685 E. Middlefield Road
|
|||
|
Mountain View, CA 94043 USA
|
|||
|
|
|||
|
Phone: 1-650-426-3832
|
|||
|
EMail: dmraihi@verisign.com
|
|||
|
|
|||
|
|
|||
|
Mihir Bellare
|
|||
|
Dept of Computer Science and Engineering, Mail Code 0114
|
|||
|
University of California at San Diego
|
|||
|
9500 Gilman Drive
|
|||
|
La Jolla, CA 92093, USA
|
|||
|
|
|||
|
EMail: mihir@cs.ucsd.edu
|
|||
|
|
|||
|
|
|||
|
Frank Hoornaert
|
|||
|
VASCO Data Security, Inc.
|
|||
|
Koningin Astridlaan 164
|
|||
|
1780 Wemmel, Belgium
|
|||
|
|
|||
|
EMail: frh@vasco.com
|
|||
|
|
|||
|
|
|||
|
David Naccache
|
|||
|
Gemplus Innovation
|
|||
|
34 rue Guynemer, 92447,
|
|||
|
Issy les Moulineaux, France
|
|||
|
and
|
|||
|
Information Security Group,
|
|||
|
Royal Holloway,
|
|||
|
University of London, Egham,
|
|||
|
Surrey TW20 0EX, UK
|
|||
|
|
|||
|
EMail: david.naccache@gemplus.com, david.naccache@rhul.ac.uk
|
|||
|
|
|||
|
|
|||
|
Ohad Ranen
|
|||
|
Aladdin Knowledge Systems Ltd.
|
|||
|
15 Beit Oved Street
|
|||
|
Tel Aviv, Israel 61110
|
|||
|
|
|||
|
EMail: Ohad.Ranen@ealaddin.com
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 36]
|
|||
|
|
|||
|
RFC 4226 HOTP Algorithm December 2005
|
|||
|
|
|||
|
|
|||
|
Full Copyright Statement
|
|||
|
|
|||
|
Copyright (C) The Internet Society (2005).
|
|||
|
|
|||
|
This document is subject to the rights, licenses and restrictions
|
|||
|
contained in BCP 78, and except as set forth therein, the authors
|
|||
|
retain all their rights.
|
|||
|
|
|||
|
This document and the information contained herein are provided on an
|
|||
|
"AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
|
|||
|
OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
|
|||
|
ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
|
|||
|
INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
|
|||
|
INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
|
|||
|
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
|||
|
|
|||
|
Intellectual Property
|
|||
|
|
|||
|
The IETF takes no position regarding the validity or scope of any
|
|||
|
Intellectual Property Rights or other rights that might be claimed to
|
|||
|
pertain to the implementation or use of the technology described in
|
|||
|
this document or the extent to which any license under such rights
|
|||
|
might or might not be available; nor does it represent that it has
|
|||
|
made any independent effort to identify any such rights. Information
|
|||
|
on the procedures with respect to rights in RFC documents can be
|
|||
|
found in BCP 78 and BCP 79.
|
|||
|
|
|||
|
Copies of IPR disclosures made to the IETF Secretariat and any
|
|||
|
assurances of licenses to be made available, or the result of an
|
|||
|
attempt made to obtain a general license or permission for the use of
|
|||
|
such proprietary rights by implementers or users of this
|
|||
|
specification can be obtained from the IETF on-line IPR repository at
|
|||
|
http://www.ietf.org/ipr.
|
|||
|
|
|||
|
The IETF invites any interested party to bring to its attention any
|
|||
|
copyrights, patents or patent applications, or other proprietary
|
|||
|
rights that may cover technology that may be required to implement
|
|||
|
this standard. Please address the information to the IETF at ietf-
|
|||
|
ipr@ietf.org.
|
|||
|
|
|||
|
Acknowledgement
|
|||
|
|
|||
|
Funding for the RFC Editor function is currently provided by the
|
|||
|
Internet Society.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
M'Raihi, et al. Informational [Page 37]
|
|||
|
|