Google authenticator
介绍
Google authenticator是一个基于TOTP原理实现的一个生成一次性密码的工具,用来做双因素登录,市面上已经有很多这些比较成熟的东西存在,像是一些经常用到的U盾,以及数字密码等
参考文档
https://tools.ietf.org/html/rfc6238
https://tools.ietf.org/html/rfc4226
实现源码 Google authenticator版本
https://github.com/google/google-authenticator-android
先来看看google-authenticator-android里面实现的一个版本,基于TOTP:Time-based One-time Password Algorithm(基于时间的一次性密码算法)
1.拿到HMACSHA1计算之后的签名
static Signer getSigningOracle(String secret) {
try {
//拿到secret base32之后的byte数组
byte[] keyBytes = decodeKey(secret);
//使用hmacsha1计算字符串的签名
final Mac mac = Mac.getInstance("HMACSHA1");
mac.init(new SecretKeySpec(keyBytes, ""));
// Create a signer object out of the standard Java MAC implementation.
return new Signer() {
@Override
public byte[] sign(byte[] data) {
return mac.doFinal(data);
}
};
} catch (DecodingException error) {
....
}
return null;
}
private static byte[] decodeKey(String secret) throws DecodingException {
return Base32String.decode(secret);
}
2.生成数字码
public String generateResponseCode(long state)
throws GeneralSecurityE