首页新闻招聘找找看知识库

谷歌身份验证 Google Authenticator

0
悬赏园豆:50 [已解决问题] 解决于 2018-01-15 19:03

用C#写谷歌身份验证的时候,手机口令校验无法通过。私钥用的都是一样的。算法是

HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))   用的时间戳。代码如下:

#region GenerateCode 生成验证码
public string GenerateCode(string accountSecretKey)
{
DateTime _epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

TimeSpan ts = DateTime.UtcNow - _epoch;
long minuteValue = (long)(ts.TotalSeconds / 30);

byte[] key = Encoding.UTF8.GetBytes(accountSecretKey);
return GenerateHashedCode(key, minuteValue);
}

internal string GenerateHashedCode(byte[] key, long thisTime)
{
byte[] counter = BitConverter.GetBytes(thisTime);

if (BitConverter.IsLittleEndian)
{
Array.Reverse(counter);
}

HMACSHA1 hmac = new HMACSHA1(key, true);
//HMACSHA1 hmac = GetHMACSha1Algorithm(key);
byte[] hash = hmac.ComputeHash(counter);

int offset = hash[hash.Length - 1] & 0xf;

// 获取4个字节组成一个整数,其中第一个字节最高位为符号位,不获取,使用0x7f
// Convert the 4 bytes into an integer, ignoring the sign.
int binary =
((hash[offset] & 0x7f) << 24)
| (hash[offset + 1] << 16)
| (hash[offset + 2] << 8)
| (hash[offset + 3]);

int password = binary % (int)Math.Pow(10, 6);
return password.ToString(new string('0', 6));
}
#endregion

 

 

麻烦大神帮忙看看,是哪里的问题?

jiaojialin7991的主页 jiaojialin7991 | 初学一级 | 园豆:154
提问于:2018-01-12 16:31
< >
分享
最佳答案
0

弄了半天,算法没有问题。原来是因为客户端和服务器端的Key不一样,服务器端生成的Key是要对客户端的Key进行Base32编码后的值。

jiaojialin7991 | 初学一级 |园豆:154 | 2018-01-15 19:02
其他回答(1)
0

您好,能否麻烦给我发个demo,我邮箱:289094675@qq.com,谢谢

于归 | 园豆:199 (初学一级) | 2018-04-11 17:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册