google身份验证器原理与应用.doc_第1页
google身份验证器原理与应用.doc_第2页
google身份验证器原理与应用.doc_第3页
google身份验证器原理与应用.doc_第4页
google身份验证器原理与应用.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

韶 关 学 院毕 业 论 文题 目:谷歌身份验证器原理与应用学生姓名:邱志光学 号:10110031026系(院):数学与信息科学学院专 业:信息与计算科学班 级:2010级 指导教师姓名及职称:杨玉锋 讲师 起止时间: 2013 年 9 月 2014 年 4 月谷歌身份验证器原理与应用摘要:随着信息科技时代的到来,互联网储存信息已经相当普及,然而安全隐患等问题也随之而层出不穷,使得Web登录安全被广泛关注。许许多多的用户都在寻求更为保障的安全防护系统,欲使机密信息不被盗取、修改和破坏等。运用动态验证码的身份验证技术,可以大大降低用户信息被攻击的几率,使信息安全得到保障。本文将深入了解如何将Google身份验证器客户端应用在个人网站登录系统中,通过测试实现Google两步验证。关键词:登录安全;Google两步验证;Google身份验证器Google Authenticator Principles and ApplicationsAbstract: With the advent of the era of information technology, the Internet store information is quite popular, however, security and other issues also subsequently and emerge in endlessly, make the Web login security has been widely concerned. Many users are looking for more protection safety protection system, to make the confidential information is being stolen, modify, and destruction, etc. Using dynamic captcha authentication technology, can greatly reduce the chance that it will attack the user information, make information security protection. This article will further understand how Google authenticator client applications in personal website login system, Google two-step verification was achieved by test.Keywords: Login security; Google two-step verification; Google authenticator目 录1 引言 (1)2 Web 系统登录安全 (1)2.1 密码技术 (1)2.2 认证技术 (1)2.3 短信动态密码验证 (2)3 Google 身份验证器 (2)3.1 什么是动态身份验证? (3)3.2 为什么要使用该功能? (3)3.3 谷歌身份验证的实现原理 (3)3.4 谷歌账户两步验证的工作原理 (3)3.5 谷歌身份验证器的安全性和优越性 (3)4 谷歌身份验证器在用户网站上的应用 (4)4.1 将两步验证功能移植进入登录系统的想法 (5)4.2 个人登录系统代码 (5)4.3 谷歌TOTP双重认证的PHP (8)4.4 两步验证的代码 (8)4.5 Google身份验证器移植进入个人网站进行测试 (16)5 结论 (19)致谢 (20)参考文献 (20) 谷歌身份验证器原理与应用10级信息与计算科学本科班 邱志光指导教师:杨玉锋 讲师1 引言随着信息化的高速发展,人们对网络安全问题越来越重视,各种信息安全问题层出不穷,使得密码学被广泛的关注。人们对信息安全的需求接踵而至,就人才竞争、市场竞争、金融危机、敌特机构等都给企事业单位的发展带来巨大风险,内部窃密、黑客攻击、无意识泄密等窃密手段成为了人与人之间、企业与企业之间、国与国之间的安全隐患,都迫切希望能够得到解决的办法。目前信息安全行业中的主流技术1有:病毒检测与清除技术,安全防护技术,安全审计技术,安全检测与监控技术,解密、加密技术和身份认证等技术。而身份验证技术是用来确定访问或介入信息系统用户或者设备身份的合法性的技术,其典型的手段有用户名口令、身份识别、PKI 证书和生物认证等。2 Web系统登录安全当前,Web的应用非常广泛,面临的安全威胁也日益严重,加强对Web应用系统安全技术的研究,对提高网络的整体安全性、促进网络的快速健康发展有着重大意义。所谓网络安全,就是网络上的信息安全,即保护网络系统的硬件、软件、数据不被偶然或者故意的泄露、更改和破坏。广义来说凡是涉及到网络上信息的保密性、完整性、可用性、真实性、确认性和可控制性的相关技术和理论都属于网络安全领域。2.1密码技术密码技术是对信息进行伪装,对机密信息进行变换,得到另一种看起来似乎与原信息不相关的表示,非法用户要从这种表示中分析出原有信息变得困难。使用密码技术不仅可以保证信息的机密性。而且可以保证信息的完整性和正确性,防止信息被篡改、仿造或假冒。2.2认证技术认证技术是信息安全的一项重要内容,很多情况下,用户并不要求信息保密,只要确认用户身份不是假冒或交互的信息是否已被第三方伪造修改。认证技术分为消息认证与身份认证。消息认证用于保证信息的完整性与抗否认性,身份认证则用于鉴别用户身份。除了上述技术,Web安全技术还有访问控制技术、防火墙技术、入侵检测技术、防病毒技术和数据备份与恢复技术、物理安全技术、虚拟网络技术等等。但是,没有一种安全技术可以完美解决Web上的所有安全问题,各种安全技术必须相互关联,相互补充,形成Web安全的立体纵深、多层防御体系。2.3短信动态密码验证短信动态密码也称短信密码,是以手机短信形式发送的6位随机数的动态密码,也是一种手机动态口令形式,身份认证系统以短信形式发送随机的6/8位密码到客户的手机上,客户在登录或者交易认证时候输入此动态密码,从而确保系统身份认证的安全性。2.3.1短信动态密码能做什么(1)可以作为登录或者交易密码(如网上银行登录或者支付,作为登录密码或支付密码认证、企业内部登录),增强身份认证的安全强度,减少盗号给用户带来的损失。(2)企业使用短信密码解决方案,无需密码因定期修改各种应用系统登录密码给IT管理和员工带来的麻烦。2.3.2短信动态密码的优缺点(1)使用简单:只要会发送短信就能使用,大大增强这项技术的普及性。(2)与应用无关:与需要登录的业务系统无关。(3)其他:如果用户更换了手机号码或信号等问题,将无法验证。3 Google 身份验证器Google 身份验证器2是谷歌官方出品的账户保护程序,用户可以借助Google 身份验证器在移动设备上生成动态验证码,比如手机等。为了个人信息的安全,避免账户信息非法入侵或盗用,用户可以开启两步验证,为自己的账户加一道防线。因为用户开启了两步验证之后,除了输入个人账户和密码,还需要另外再输入移动设备上的动态验证码才能完成登录。当然除了可以在移动设备上产生验证码,还可以以信息的方式发到用户的手机或者以e-mail方式发到用户指定的邮箱。Google身份验证器支持多种语言,支持多个账户应用,并且在设备飞行的模式下也能正常使用,所以运用起来就更加方便了。3.1什么是动态身份验证?3动态验证是将用户的移动设备与网站账号绑定。每次登陆用户网站,不仅需要输入登陆密码,还需输入移动设备生成的一次性动态验证码。这样,即使登陆密码泄露,攻击者由于没有用户的移动设备,仍然无法登陆用户网站,保证用户的数据安全。目前,很多云储存的网站也采用了这样的身份验证技术,都是为了同样的目的,那就是保证信息的安全。3.2为什么要使用该功能?为什么要是用这种功能?因为在现实生活中,大多数互联网用户为了方便记忆,喜欢在不同网站使用相同的账号密码。这些做法看似方便了自己,但却给不法分子有了可趁之机,一旦他们通过某个渠道获取了用户的账号密码,就可以窃取用户所有网站的个人信息。用户最为隐私的数据,一旦泄露后果不堪设想。使用动态身份验证可以比较有效防止此类事故的发生,让用户的信息变得更加安全可靠。3.3谷歌身份验证的实现原理4服务器端通过特定算法随机生成一个密钥,并且把这个密钥保存在数据库中。根据生成的密钥在页面上生成一个二维码,内容是一个URI地址。用户通过扫描二维码,把密钥保存在客户端。客户端每30秒使用密钥和时间戳通过一种算法生成一个6位数字的一次性密码。服务器端使用保存在数据库中的密钥和时间戳通过同一种算法生成一个6位数字的一次性密码,用户登陆时输入一次性密码与服务器端进行验证,如果一样,就登录成功了。3.4谷歌账户两步验证的工作原理5Google的两步验证算法源自另一种名为HMAC-Based One-Time Password的算法,简称HOTP。HOTP的工作原理如下:客户端和服务器事先协商好一个密钥K,用于一次性密码的生成过程,此密钥不被任何第三方所知道。此外客户端和服务器端各有一个计数器C,并且事先将计数值同步。进行验证时,客户端对密钥和计数器的组合(K,C)使用HMAC(Hash-based Message Authentication Code)算法计算一次性密码,公式如下:HOTP(K,C) = Truncate(HMAC-SHA-1(K,C)上面采用了HMAC-SHA-1,当然也可以使用HMAC-MD5等。HMAC算法得出的值位数比较多,不方便用户输入,因此需要截断(Truncate)成为一组不太长十进制数(例如6位)。计算完成之后客户端计数器C计数值加1。用户将这一组十进制数输入并且提交之后,服务器端同样的计算,并且与用户提交的数值比较,如果相同,则验证通过,服务器端将计数值C增加1。如果不相同,则验证失败。3.5谷歌身份验证器的安全性和优越性6对有些人来说,盗取用户密码比想象的更简单,以下任意一种常见操作都可能让用户面临密码被盗的风险,比如在多个网站上使用同一密码或是从互联网上下载软件或是点击电子邮件中的链接等。想像一下无法访问自己的帐户,这将是多么可怕的事情。当被别有用心的人盗取密码后,他们能让用户无法访问自己的帐户,还可以执行以下操作:翻看(甚至删除)用户所有的电子邮件、联系人、照片或冒充用户本人给用户的联系人发送垃圾邮件或有害的电子邮件或使用用户的帐户重置其他帐户(银行帐户、购物帐户等)的密码,这些都是非常危险的情况,应该想办法解决的。两步验证可以将别有用心的人阻挡在外,即使他们知道密码也无可奈何。每当登录 Google 时,都需要照常输入密码。然后,系统会要求输入通过手机短信、语音电话或移动应用获得的验证码。在登录过程中,用户可以指示系统在“该计算机”上不再要求输入验证码。从这时起,当用户在该计算机上登录时,系统只会要求输入密码。即便如此,用户仍将得到保护,因为当用户或其他人从其他计算机登录用户帐户时,仍然需要输入验证码。大多数用户的帐户只有密码这一道安全防线。有了两步验证,即使别有用心的人通过黑客手段攻破用户的密码防线,也还需要拿到用户的移动设备才能进入帐户。借助两步验证,用户可以通过用户知道的信息(密码)和拥有的东西(移动设备)为帐户提供保护。4 谷歌身份验证器在用户网站上的应用 像谷歌一样,如果个人网站也能开启使用两步验证,那么信息安全就可以得到更好的保障,使用户放心的存放信息。4.1 将两步验证功能移植进入登录系统的想法偶然的一次经历,就像往常一样打开自己的google,却发现系统提示密码错误等信息,倒是还不以为然,又将密码仔仔细细地输了一遍,系统仍然提示密码错误。潜意识告诉自己,这是密码被盗的征兆吧。于是就申请了账号申诉,经过一段时间终于将自己的账户索取回来,重新登录到上面一看,虽然没什么太大的损失,但是个人资料和一些相关的敏感信息已经被修改,主页上也多了许许多多的非法的信息,经过一番整理才恢复了原样。当时的想法就是,得再加一道防线来保护自己的账户,后来发现google的两步验证正好可以解决类似这样的问题,开始对其进行了解。Google开源出来的应用软件google身份验证器也有了相应的客户端,无论你是苹果、安卓、黑莓甚至是诺基亚塞班系统,都可以将这个软件应用在你的手机或移动设备上,这将是一个性的突破发展。经过查阅了相关资料,有了将两步验证应用到普通的登录验证上,对帐户进行更好的保护。首先,是制作一个简单的登陆系统,然后用户登录之后也可以进行两步验证的开启,然后借用google2FA算法产生16位随机字符串作为密钥保存在服务端,并生成二维码在页面上显示,提供给用户进行扫描,前提是用户安装了相应客户端的google身份验证器。扫面之后验证器会将16位数字密钥保存在客户端,并产生6位动态密码,每30秒变换更新一次。服务端也根据算法生成与客户端比对的6位动态密码。在规定时间内输入客户端上显示的6位数字,进行验证,如果验证成功,则开启成功。之后用户每次登录都将提示输入6位验证码进行验证,同样是验证成功,则登陆成功。4.2 个人登录系统代码登录系统由index.php和login.php两部分组成。在登陆界面index.php中,输入用户名和密码,单击登录按钮之后,将跳转到login.php进行验证若用户名不存在或者密码错误等都会弹出提示。登陆成功后会提示进入两步验证界面。代码如下:index.php代码:用户登录    用户名:    密  码: login.php代码:?php session_start();$conn = mysql_connect(localhost,root,admin);if(!$conn)die(数据库连接失败:.mysql_error();$username = $_POSTusername;$password = $_POSTpassword;$_SESSIONname = $username;mysql_select_db(users,$conn);$result = mysql_query(SELECT * FROM users WHERE name=$username);$row = mysql_fetch_array($result);if(mysql_num_rows($result)!=1)echo alert(用户名不存在); window.location.href=./index.php;else if($rowpassword!=$password)echo alert(密码不正确); window.location.href=./index.php;elseif(!$rowtoken) $url = http:/localhost/users/step.php; echo alert(开启两步验证);window.location.href=$url;else$url = http:/localhost/users/chek.php; echo alert(请进行动态验证);window.location.href=$url;mysql_close($conn);exit();?4.3 谷歌TOTP双因素身份验证为的PHP7 Google 身份验证器基于 RFC 4226-基于时间的一次密码 (TOTP) 初始化使用一个 16 位数字基地 32 (RFC 4648) 编码的种子值。TOTP 用于初始种子可以在通过使用 QR 码相机或通过键盘输入的 Google 身份验证器。Google 还提供了允许用户集成为 sshd 2FA PAM 模块。可以写一个模块,支持在任何语言的 Google TOTP-唯一需要说明为 PHP 编写的库是 RFC 4648 符合基地 32 解码功能的缺乏。基地 32 函数需要解码的初始种子。这可能是实施谷歌2FA最棘手的部分。 4.4 两步验证的代码 当确定“开启两步验证”时,就会跳转到step.php界面,step.php文件将运用一个类class Google2FA8,产生16位随机字符串保存在名为users数据库的users表中的token字段中,产生二维码显示在页面中提供扫描。之后点击“动态密码验证”后,跳转到chek.php文件。Chek.php也同样运用class Google2FA与时间戳计算出一串为6为数字的动态密码。用户使用移动设备扫描二维码,也将16位随机数字保存在客户端,在屏幕显示6位动态密码,输入与服务端的比较,如果相同,则登录验证成功。代码如下:step.php代码: 0,B = 1,C = 2,D = 3,E = 4,F = 5,G = 6,H = 7,I = 8,J = 9,K = 10,L = 11,M = 12,N = 13,O = 14,P = 15,Q = 16,R = 17,S = 18,T = 19,U = 20,V = 21,W = 22,X = 23,Y = 24,Z = 25,2 = 26,3 = 27,4 = 28,5 = 29,6 = 30,7 = 31);public static function generate_secret_key($length = 16) $b32 = 234567QWERTYUIOPASDFGHJKLZXCVBNM;$s = ;for ($i = 0; $i $length; $i+)$s .= $b32rand(0,31);return $s;public static function get_timestamp() return floor(microtime(true)/self:keyRegeneration);public static function base32_decode($b32) $b32 = strtoupper($b32);if (!preg_match(/ABCDEFGHIJKLMNOPQRSTUVWXYZ234567+$/, $b32, $match)throw new Exception(Invalid characters in the base32 string.);$l = strlen($b32);$n= 0;$j= 0;$binary = ;for ($i = 0; $i $l; $i+) $n = $n = 8) $j = $j - 8;$binary .= chr($n & (0xFF $j);return $binary;public static function oath_hotp($key, $counter) if (strlen($key) 8)throw new Exception(Secret key is too short. Must be at least 16 base 32 characters); $bin_counter = pack(N*, 0) . pack(N*, $counter); $hash = hash_hmac (sha1, $bin_counter, $key, true); return str_pad(self:oath_truncate($hash), self:otpLength, 0, STR_PAD_LEFT);public static function verify_key($b32seed, $key, $window = 4, $useTimeStamp = true) $timeStamp = self:get_timestamp();if ($useTimeStamp != true) $timeStamp = (int)$useTimeStamp;$binarySeed = self:base32_decode($b32seed);for ($ts = $timeStamp - $window; $ts = $timeStamp + $window; $ts+)if (self:oath_hotp($binarySeed, $ts) = $key)return true;return false;public static function oath_truncate($hash) $offset = ord($hash19) & 0xf; return ( (ord($hash$offset+0) & 0x7f) 24 ) | (ord($hash$offset+1) & 0xff) 16 ) | (ord($hash$offset+2) & 0xff) 8 ) | (ord($hash$offset+3) & 0xff) ) % pow(10, self:otpLength);$token = Google2FA:generate_secret_key(); $username = $_SESSIONname;$_SESSIONkey = $token; mysql_select_db(users,$conn); mysql_query(UPDATE users SET token=$token WHERE name=$username);echo 请用设备扫面二维码;echo ;echo ;echo 动态密码验证;mysql_close($conn);? chek.php代码: 0,B = 1,C = 2,D = 3,E = 4,F = 5,G = 6,H = 7,I = 8,J = 9,K = 10,L = 11,M = 12,N = 13,O = 14,P = 15,Q = 16,R = 17,S = 18,T = 19,U = 20,V = 21,W = 22,X = 23,Y = 24,Z = 25,2 = 26,3 = 27,4 = 28,5 = 29,6 = 30,7 = 31);public static function generate_secret_key($length = 16) $b32 = 234567QWERTYUIOPASDFGHJKLZXCVBNM;$s = ;for ($i = 0; $i $length; $i+)$s .= $b32rand(0,31);return $s;public static function get_timestamp() return floor(microtime(true)/self:keyRegeneration);public static function base32_decode($b32) $b32 = strtoupper($b32);if (!preg_match(/ABCDEFGHIJKLMNOPQRSTUVWXYZ234567+$/, $b32, $match)throw new Exception(Invalid characters in the base32 string.);$l = strlen($b32);$n= 0;$j= 0;$binary = ;for ($i = 0; $i $l; $i+) $n = $n = 8) $j = $j - 8;$binary .= chr($n & (0xFF $j);return $binary;public static function oath_hotp($key, $counter) if (strlen($key) 8)throw new Exception(Secret key is too short. Must be at least 16 base 32 characters); $bin_counter = pack(N*, 0) . pack(N*, $counter); $hash = hash_hmac (sha1, $bin_counter, $key, true); return str_pad(self:oath_truncate($hash), self:otpLength, 0, STR_PAD_LEFT);public static function verify_key($b32seed, $key, $window = 4, $useTimeStamp = true) $timeStamp = self:get_timestamp();if ($useTimeStamp != true) $timeStamp = (int)$useTimeStamp;$binarySeed = self:base32_decode($b32seed);for ($ts = $timeStamp - $window; $ts = $timeStamp + $window; $ts+)if (self:oath_hotp($binarySeed, $ts) = $key)return true;return false;public static function oath_truncate($hash) $offset = ord($hash19) & 0xf; return ( (ord($hash$offset+0) & 0x7f) 24 ) | (ord($hash$offset+1) & 0xff) 16 ) | (ord($hash$offset+2) & 0xff) 8 ) | (ord($hash$offset+3) & 0xff) ) % pow(10, self:otpLength); $username = $_SESSIONname; mysql_select_db(users,$conn); $result = mysql_query(SELECT token FROM users WHERE name=$username);$row = mysql_fetch_array($result); $token = $rowtoken; echo ;echo ;echo 验证动态密码;echo ;echo 输入6位动态密码: ;if (!empty($_GETotp) if ( Google2FA:verify_key($token, $_GETotp) ) $result = 验证成功; else $result = 验证失败;echo 验证结果: $result;?4.5 Google身份验证器移植进入个人网站进行测试在index.php文件中输入预设的用户名:cupid密码:12341234按照提示进行测试。下面是步骤及截图:当输入完成,点击登录按钮则进入,见图1。图1 用户登录示意图确认“开启两步验证”,见图2。图2 开启两步验证提示示意图用移动设备扫描二维码,再点击“动态密码验证”,见图3。图3 动态验证提示示意图输入移动设备上的动态密码,见图4。图4 验证动态密码示意图点击“验证”,检验结果,见图5。图5 验证成功示意图当用户再次登录时,将显示如下提示框,请点击确认进行“请进行动态验证” ,见图6。图6 动态验证提示示意图输

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论