keycloak
クラス | 公開メンバ関数 | 静的公開メンバ関数 | 静的公開変数類 | 限定公開変数類 | 非公開変数類 | 全メンバ一覧
org.keycloak.models.utils.TimeBasedOTP クラス
org.keycloak.models.utils.TimeBasedOTP の継承関係図
Inheritance graph
org.keycloak.models.utils.TimeBasedOTP 連携図
Collaboration graph

クラス

class  Clock
 

公開メンバ関数

 TimeBasedOTP ()
 
 TimeBasedOTP (String algorithm, int numberDigits, int timeIntervalInSeconds, int lookAheadWindow)
 
String generateTOTP (String secretKey)
 
boolean validateTOTP (String token, byte[] secret)
 
void setCalendar (Calendar calendar)
 
String generateHOTP (String key, int counter)
 
int validateHOTP (String token, String key, int counter)
 
String generateOTP (String key, String counter, int returnDigits, String crypto)
 

静的公開メンバ関数

static String generateSecret (int length)
 

静的公開変数類

static final int DEFAULT_INTERVAL_SECONDS = 30
 
static final int DEFAULT_DELAY_WINDOW = 1
 
static final String HMAC_SHA1 = "HmacSHA1"
 
static final String HMAC_SHA256 = "HmacSHA256"
 
static final String HMAC_SHA512 = "HmacSHA512"
 
static final String DEFAULT_ALGORITHM = HMAC_SHA1
 
static final int DEFAULT_NUMBER_DIGITS = 6
 

限定公開変数類

final String algorithm
 
final int numberDigits
 
final int lookAheadWindow
 

非公開変数類

Clock clock
 

詳解

TOTP: Time-based One-time Password Algorithm Based on http://tools.ietf.org/html/draft-mraihi-totp-timebased-06

著者
anil saldhana
から
Sep 20, 2010

構築子と解体子

◆ TimeBasedOTP() [1/2]

org.keycloak.models.utils.TimeBasedOTP.TimeBasedOTP ( )
inline
37  {
39  }
static final int DEFAULT_NUMBER_DIGITS
Definition: HmacOTP.java:34
static final int DEFAULT_DELAY_WINDOW
Definition: TimeBasedOTP.java:33
static final int DEFAULT_INTERVAL_SECONDS
Definition: TimeBasedOTP.java:32
static final String DEFAULT_ALGORITHM
Definition: HmacOTP.java:33

◆ TimeBasedOTP() [2/2]

org.keycloak.models.utils.TimeBasedOTP.TimeBasedOTP ( String  algorithm,
int  numberDigits,
int  timeIntervalInSeconds,
int  lookAheadWindow 
)
inline
引数
algorithmthe encryption algorithm
numberDigitsthe number of digits for tokens
timeIntervalInSecondsthe number of seconds a token is valid
lookAheadWindowthe number of previous intervals that should be used to validate tokens.
47  {
49  this.clock = new Clock(timeIntervalInSeconds);
50  }
final int lookAheadWindow
Definition: HmacOTP.java:39
final int numberDigits
Definition: HmacOTP.java:38
Clock clock
Definition: TimeBasedOTP.java:35
final String algorithm
Definition: HmacOTP.java:37

関数詳解

◆ generateHOTP()

String org.keycloak.models.utils.HmacOTP.generateHOTP ( String  key,
int  counter 
)
inlineinherited
58  {
59  String steps = Integer.toHexString(counter).toUpperCase();
60 
61  // Just get a 16 digit string
62  while (steps.length() < 16)
63  steps = "0" + steps;
64 
65  return generateOTP(key, steps, numberDigits, algorithm);
66 
67  }
String generateOTP(String key, String counter, int returnDigits, String crypto)
Definition: HmacOTP.java:100
final int numberDigits
Definition: HmacOTP.java:38
final String algorithm
Definition: HmacOTP.java:37

◆ generateOTP()

String org.keycloak.models.utils.HmacOTP.generateOTP ( String  key,
String  counter,
int  returnDigits,
String  crypto 
)
inlineinherited

This method generates an OTP value for the given set of parameters.

引数
keythe shared secret, HEX encoded
countera value that reflects a time
returnDigitsnumber of digits to return
cryptothe crypto function to use
戻り値
A numeric String in base 10 that includes return digits
例外
java.security.GeneralSecurityException
100  {
101  String result = null;
102  byte[] hash;
103 
104  // Using the counter
105  // First 8 bytes are for the movingFactor
106  // Complaint with base RFC 4226 (HOTP)
107  while (counter.length() < 16)
108  counter = "0" + counter;
109 
110  // Get the HEX in a Byte[]
111  byte[] msg = hexStr2Bytes(counter);
112 
113  // Adding one byte to get the right conversion
114  // byte[] k = hexStr2Bytes(key);
115  byte[] k = key.getBytes();
116 
117  hash = hmac_sha1(crypto, k, msg);
118 
119  // put selected bytes into result int
120  int offset = hash[hash.length - 1] & 0xf;
121 
122  int binary = ((hash[offset] & 0x7f) << 24) | ((hash[offset + 1] & 0xff) << 16) | ((hash[offset + 2] & 0xff) << 8)
123  | (hash[offset + 3] & 0xff);
124 
125  int otp = binary % DIGITS_POWER[returnDigits];
126 
127  result = Integer.toString(otp);
128 
129  while (result.length() < returnDigits) {
130  result = "0" + result;
131  }
132  return result;
133  }
byte [] hmac_sha1(String crypto, byte[] keyBytes, byte[] text)
Definition: HmacOTP.java:147
byte [] hexStr2Bytes(String hex)
Definition: HmacOTP.java:170
static final int [] DIGITS_POWER
Definition: HmacOTP.java:36

◆ generateSecret()

static String org.keycloak.models.utils.HmacOTP.generateSecret ( int  length)
inlinestaticinherited
47  {
48  String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW1234567890";
49  SecureRandom r = new SecureRandom();
50  StringBuilder sb = new StringBuilder();
51  for (int i = 0; i < length; i++) {
52  char c = chars.charAt(r.nextInt(chars.length()));
53  sb.append(c);
54  }
55  return sb.toString();
56  }

◆ generateTOTP()

String org.keycloak.models.utils.TimeBasedOTP.generateTOTP ( String  secretKey)
inline

Generates a token.

引数
secretKeythe secret key to derive the token from.
57  {
58  long T = this.clock.getCurrentInterval();
59 
60  String steps = Long.toHexString(T).toUpperCase();
61 
62  // Just get a 16 digit string
63  while (steps.length() < 16)
64  steps = "0" + steps;
65 
66  return generateOTP(secretKey, steps, this.numberDigits, this.algorithm);
67  }
String generateOTP(String key, String counter, int returnDigits, String crypto)
Definition: HmacOTP.java:100
final int numberDigits
Definition: HmacOTP.java:38
Clock clock
Definition: TimeBasedOTP.java:35
long getCurrentInterval()
Definition: TimeBasedOTP.java:109
final String algorithm
Definition: HmacOTP.java:37

◆ setCalendar()

void org.keycloak.models.utils.TimeBasedOTP.setCalendar ( Calendar  calendar)
inline
96  {
97  this.clock.setCalendar(calendar);
98  }
Clock clock
Definition: TimeBasedOTP.java:35
void setCalendar(Calendar calendar)
Definition: TimeBasedOTP.java:119

◆ validateHOTP()

int org.keycloak.models.utils.HmacOTP.validateHOTP ( String  token,
String  key,
int  counter 
)
inlineinherited
引数
token
key
counter
戻り値
-1 if not a match. A positive number means successful validation. This positive number is also the new value of the counter
76  {
77 
78  int newCounter = counter;
79  for (newCounter = counter; newCounter <= counter + lookAheadWindow; newCounter++) {
80  String candidate = generateHOTP(key, newCounter);
81  if (candidate.equals(token)) {
82  return newCounter + 1;
83  }
84 
85  }
86  return -1;
87  }
final int lookAheadWindow
Definition: HmacOTP.java:39
String generateHOTP(String key, int counter)
Definition: HmacOTP.java:58

◆ validateTOTP()

boolean org.keycloak.models.utils.TimeBasedOTP.validateTOTP ( String  token,
byte []  secret 
)
inline

Validates a token using a secret key.

引数
tokenOTP string to validate
secretShared secret
戻り値
76  {
77  long currentInterval = this.clock.getCurrentInterval();
78 
79  for (int i = this.lookAheadWindow; i >= 0; --i) {
80  String steps = Long.toHexString(currentInterval - i).toUpperCase();
81 
82  // Just get a 16 digit string
83  while (steps.length() < 16)
84  steps = "0" + steps;
85 
86  String candidate = generateOTP(new String(secret), steps, this.numberDigits, this.algorithm);
87 
88  if (candidate.equals(token)) {
89  return true;
90  }
91  }
92 
93  return false;
94  }
final int lookAheadWindow
Definition: HmacOTP.java:39
String generateOTP(String key, String counter, int returnDigits, String crypto)
Definition: HmacOTP.java:100
final int numberDigits
Definition: HmacOTP.java:38
Clock clock
Definition: TimeBasedOTP.java:35
long getCurrentInterval()
Definition: TimeBasedOTP.java:109
final String algorithm
Definition: HmacOTP.java:37

メンバ詳解

◆ algorithm

final String org.keycloak.models.utils.HmacOTP.algorithm
protectedinherited

◆ clock

Clock org.keycloak.models.utils.TimeBasedOTP.clock
private

◆ DEFAULT_ALGORITHM

final String org.keycloak.models.utils.HmacOTP.DEFAULT_ALGORITHM = HMAC_SHA1
staticinherited

◆ DEFAULT_DELAY_WINDOW

final int org.keycloak.models.utils.TimeBasedOTP.DEFAULT_DELAY_WINDOW = 1
static

◆ DEFAULT_INTERVAL_SECONDS

final int org.keycloak.models.utils.TimeBasedOTP.DEFAULT_INTERVAL_SECONDS = 30
static

◆ DEFAULT_NUMBER_DIGITS

final int org.keycloak.models.utils.HmacOTP.DEFAULT_NUMBER_DIGITS = 6
staticinherited

◆ HMAC_SHA1

final String org.keycloak.models.utils.HmacOTP.HMAC_SHA1 = "HmacSHA1"
staticinherited

◆ HMAC_SHA256

final String org.keycloak.models.utils.HmacOTP.HMAC_SHA256 = "HmacSHA256"
staticinherited

◆ HMAC_SHA512

final String org.keycloak.models.utils.HmacOTP.HMAC_SHA512 = "HmacSHA512"
staticinherited

◆ lookAheadWindow

final int org.keycloak.models.utils.HmacOTP.lookAheadWindow
protectedinherited

◆ numberDigits

final int org.keycloak.models.utils.HmacOTP.numberDigits
protectedinherited

このクラス詳解は次のファイルから抽出されました: