[英]PHP one-time password?
我一直在努力學習HOTP ( Android Google Authentication的基於計數器的HOTP代碼)的方法。 我找到了此代碼,該代碼具有在服務器和客戶端(Mobile APP)之間共享密鑰的能力。
<?php
function oath_hotp($key,$counter) {
// Convert to padded binary string
$data = pack ('C*', $counter);
$data = str_pad($data,8,chr(0),STR_PAD_LEFT);
// HMAC
return hash_hmac('sha1',$data,$key);
}
function oath_truncate($hash, $length = 6) {
// Convert to dec
foreach(str_split($hash,2) as $hex) {
$hmac_result[]=hexdec($hex);
}
// Find offset
$offset = $hmac_result[19] & 0xf;
// Algorithm from RFC
return (
(($hmac_result[$offset+0] & 0x7f) << 24 ) |
(($hmac_result[$offset+1] & 0xff) << 16 ) |
(($hmac_result[$offset+2] & 0xff) << 8 ) |
($hmac_result[$offset+3] & 0xff)
) % pow(10,$length);
}
print "<pre>";
print "Compare results with:";
print " http://tools.ietf.org/html/draft-mraihi-oath-hmac-otp-04\n";
print "Count\tHash\t\t\t\t\t\tPin\n";
for($i=0;$i<10;$i++){
print $i."\t".($a=oath_hotp("mysecretvalue",$i));
print "\t".oath_truncate($a)."\n";
}
?>
這將輸出以下內容-
Compare results with: http://tools.ietf.org/html/draft-mraihi-oath-hmac-otp-04
Count Hash Pin
0 f25e6c58cc7a2dfedae7eb48a1bff891aa0c0189 472801
1 b52adf13022511f08740566fb44c0b267d7c2604 983856
2 3c693c66f6e04178943dc9badc0dd41318dbc7f7 981065
3 1225cf508043a59fe2e39e335ff5f3e5795131ba 683381
4 21a9756e8de58df5e10c9292e0147823ba03539b 675192
5 7339c3496cebdaf3a035eaba888f61d8c19d8cf9 575624
6 c7c03ce2174f144a329664d35cc90e70a3686596 406934
7 431a75f26b9950f0206911667f3a2ed7fdfc43c7 172241
8 81e05a2d9e060a25f515b1e53170dce4daad5cc7 818865
9 ff2068918dc53db45a0c338d8de99419cf3cb571 723917
現在我的問題是我無法管理上面的代碼在客戶端和服務器端都能正常工作。 我使用了相同的密鑰print $i."\\t".($a=oath_hotp("**mysecretvalue**",$i));
輸出完全不同。 請注意,這是基於計數器的,這意味着沒有時間同步,如TOTP 。
我已經在Android手機和服務器端檢查了兩次我的密碼。 有什么事嗎 請注意,我對PHP安全性不是很熟悉。 因此,如果以上方法不適用於Google的身份驗證,請向我提供一個起點。
謝謝
Google身份驗證器將輸入密碼作為RFC 3548 base32( https://code.google.com/p/google-authenticator/ ),並且您正在使用ASCII密碼。
您擁有的php代碼很好(您可以通過以ASCII形式輸入“ 12345678901234567890”的機密,並與http://www.ietf.org/rfc/rfc4226.txt的附錄D進行比較來查看 )。
您需要做的就是將您在Google身份驗證器中輸入的密碼從base32轉換為ASCII。
您可以從github https://github.com/devicenull/PHP-Google-Authenticator/blob/master/base32.php使用此實用程序類base32為您完成轉換,然后添加:
include_once "base32.php";
$keyToTest = "mysecretvalue";
$b = new Base32(Base32::csRFC3548);
$keyToTest = $b->toString($keyToTest);
for($i=0;$i<10;$i++){
print $i."\t".($a=oath_hotp($keyToTest,$i));
print "\t".oath_truncate($a)."\n";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.