Opening a door with a key
Fingerprint scan
Requiring pet name
USB key
SMS token
Facial recognition
Using ATM(cash machine)
SSH
def generate_otp(input, padded=true)
hmac = OpenSSL::HMAC.digest(
OpenSSL::Digest.new(digest),
byte_secret,
int_to_bytestring(input)
)
offset = hmac[-1].ord & 0xf
code = (hmac[offset].ord & 0x7f) << 24 |
(hmac[offset + 1].ord & 0xff) << 16 |
(hmac[offset + 2].ord & 0xff) << 8 |
(hmac[offset + 3].ord & 0xff)
if padded
(code % 10 ** digits).to_s.rjust(digits, '0')
else
code % 10 ** digits
end
end
totp = ROTP::TOTP.new("secret", # required, Base32 encoded
interval: 30,
digits: 6,
digest: 'sha1'
issuer: 'app-name'
)
code = totp.now # => "323207"
totp.verify(code) # => true
sleep(30)
totp.verify(code) # => false
totp.vefify_with_drift(code, 30) # => true
# @param [Integer] drift the number of seconds # that the client and server are # allowed to drift apart
https://github.com/mdp/rotp/blob/master/lib/rotp/totp.rb#L41
otpauth://TYPE/LABEL?PARAMETERS otpauth://totp/flufy@cat.com?secret=abc123&issuer=cat