import org.apache.commons.codec.binary.Base32;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
/**
* google身份验证器,java服务端实现
*/
public class GoogleAuthenticator {
// 生成的key长度( Generate secret key length)
public static final int SECRET_SIZE = 10;
public static final String SEED = "g8GjEvTbW5oVSV7avL47357438reyhreyuryetredLDVKs2m0QN7vxRs2im5MDaNCWGmcD2rvcZx";
// Java实现随机数算法
public static final String RANDOM_NUMBER_ALGORITHM = "SHA1PRNG";
// 最多可偏移的时间
int window_size = 3; // default 3 - max 17
/**
* set the windows size. This is an integer value representing the number of
* 30 second windows we allow The bigger the window, the more tolerant of
* clock skew we are.
*
* @param s
* window size - must be >=1 and = 1 && s >>= 8) {
data[i] = (byte) value;
}
SecretKeySpec signKey = new SecretKeySpec(key, "HmacSHA1");
Mac mac = Mac.getInstance("HmacSHA1");
mac.init(signKey);
byte[] hash = mac.doFinal(data);
int offset = hash[20 - 1] & 0xF;
// We're using a long because Java hasn't got unsigned int.
long truncatedHash = 0;
for (int i = 0; i < 4; ++i) {
truncatedHash
关注
打赏
热门博文
- 【区块链 | Solidity】跟我学 Solidity(5):函数合约的创建和继承
- 【区块链 | Solidity】跟我学 Solidity(4):函数
- 【区块链 | Solidity】跟我学 Solidity(3):引用变量
- 【区块链 | Solidity】跟我学 Solidity(1):开发环境
- 【区块链 | Solidity】区块链抢红包代码,基于Solidity的抢红包代码
- 【区块链 | Merkle】使用Merkle Tree空投,白名单验证
- 【区块链】Web3.0黑话合集:区块链/Token等专业术语
- 【区块链 | 以太坊】EVM 学习手册
- ENS私链部署
- 【区块链 | IPFS】通过Web应用向IPFS上传文件