“md5+隨機(jī)”方式加密

          Posted on 2011-11-29 09:40 陳小東 閱讀(1009) 評(píng)論(2)  編輯  收藏
          摘要:

          1 加Salt散列
          2 ASP.NET 2.0 Membership中與密碼散列有關(guān)的代碼

          聲明:本文所羅列之源代碼均通過Reflector取自.NET Framework類庫,引用這些代碼僅出于學(xué)習(xí)和研究的目的。

          其實(shí),對(duì)密碼進(jìn)行散列存儲(chǔ)不是一個(gè)新鮮話題了,解決起來也不是很難,但很多人還是不大了解。這個(gè)小文只是強(qiáng)調(diào)一下“加Salt散列”這個(gè)簡(jiǎn)單的技術(shù),并給出ASP.NET Membership所使用的代碼。

          本來打算寫一篇介紹如何實(shí)現(xiàn)用戶登錄功能的文章的,但因?yàn)闀r(shí)間有限,所以先介紹一下密碼的散列,下一篇再介紹用戶登錄。

          ----

          1 密碼必須散列存儲(chǔ)

          (內(nèi)容略)

          2 加Salt散列

          我們知道,如果直接對(duì)密碼進(jìn)行散列,那么黑客(統(tǒng)稱那些有能力竊取用戶數(shù)據(jù)并企圖得到用戶密碼的人)可以對(duì)一個(gè)已知密碼進(jìn)行散列,然后通過對(duì)比散列值得到某用戶的密碼。換句話說,雖然黑客不能取得某特定用戶的密碼,但他可以知道使用特定密碼的用戶有哪些。

          加Salt可以一定程度上解決這一問題。所謂加Salt,就是加點(diǎn)“佐料”。其基本想法是這樣的——當(dāng)用戶首次提供密碼時(shí)(通常是注冊(cè)時(shí)),由系統(tǒng)自動(dòng)往這個(gè)密碼里撒一些“佐料”,然后再散列。而當(dāng)用戶登錄時(shí),系統(tǒng)為用戶提供的代碼撒上同樣的“佐料”,然后散列,再比較散列值,已確定密碼是否正確。

          這里的“佐料”被稱作“Salt值”,這個(gè)值是由系統(tǒng)隨機(jī)生成的,并且只有系統(tǒng)知道。這樣,即便兩個(gè)用戶使用了同一個(gè)密碼,由于系統(tǒng)為它們生成的salt值不同,他們的散列值也是不同的。即便黑客可以通過自己的密碼和自己生成的散列值來找具有特定密碼的用戶,但這個(gè)幾率太小了(密碼和salt值都得和黑客使用的一樣才行)。

          下面詳細(xì)介紹一下加Salt散列的過程。介紹之前先強(qiáng)調(diào)一點(diǎn),前面說過,驗(yàn)證密碼時(shí)要使用和最初散列密碼時(shí)使用“相同的”佐料。所以Salt值是要存放在數(shù)據(jù)庫里的。


          用戶注冊(cè)時(shí):

          1)用戶提供密碼(以及其他用戶信息);
          2)系統(tǒng)為用戶生成Salt值;
          3)系統(tǒng)將Salt值和用戶密碼連接到一起;
          4)對(duì)連接后的值進(jìn)行散列,得到Hash值;
          5)將Hash值和Salt值分別放到數(shù)據(jù)庫中。


          登錄時(shí):
          1)用戶提供用戶名和密碼;
          2)系統(tǒng)通過用戶名找到與之對(duì)應(yīng)的Hash值和Salt值;
          3)系統(tǒng)將Salt值和用戶提供的密碼連接到一起;
          4)對(duì)連接后的值進(jìn)行散列,得到Hash'(注意有個(gè)“撇”);
          5)比較Hash和Hash'是否相等,相等則表示密碼正確,否則表示密碼錯(cuò)誤。

          3 ASP.NET 2.0 Membership中的相關(guān)代碼
          (省略關(guān)于Membership的介紹若干字)
          本文Anders Liu僅研究了SqlMembershipProvider,該類位于System.Web.dll,System.Web.Security命名空間中。
          首先,要使用Membership,必須先用aspnet_regsql.exe命令來配置數(shù)據(jù)庫,該工具會(huì)向現(xiàn)有數(shù)據(jù)庫中添加一系列表和存儲(chǔ)過程等,配置好的數(shù)據(jù)庫中有一個(gè)表aspnet_Membership,就是用于存放用戶帳戶信息的。其中我們所關(guān)注的列有三個(gè)——Password、PasswordFormat和PasswordSalt。

          Password存放的是密碼的散列值,PasswordFormat存放用于散列密碼所使用的算法,PasswordSalt就是系統(tǒng)生成的Salt值了。

          網(wǎng)站安全了,程序自然也就復(fù)雜了...
               discuz的加密方式:md5(md5($password).$salt),$salt是一個(gè)6位隨機(jī)數(shù)。
               注冊(cè)的時(shí)候,把用戶的密碼用md5(md5($password).$salt)加密,$salt是一個(gè)6位隨機(jī)數(shù)字,下面是我的一個(gè)獲取6位隨機(jī)數(shù)的一個(gè)方法:
               function randstr($len=6) {
               $chars='abcdefghijklmnopqrstuvwxyz0123456789';
          // characters to build the password from
               mt_srand((double)microtime()*1000000*getmypid());
          // seed the random number generater (must be done)
               $password='';
               while(strlen($password)<$len)
                   $password.=substr($chars,(mt_rand()%strlen($chars)),1);
               return $password;
          }
               $salt=randstr();把randstr()賦值給$salt,然后用md5(md5(會(huì)員提交的密碼).$salt)加密就可以了,但是千萬不要忘了把$salt入庫哦(uc_members表)。
               登陸的時(shí)候根據(jù)用戶名把$salt取出來,用md5(md5(會(huì)員提交的密碼).$salt)匹配密碼,如果一樣就登陸成功了

          Feedback

          # re: “md5+隨機(jī)”方式加密  回復(fù)  更多評(píng)論   

          2014-07-14 11:15 by tangyue
          weqweq

          # re: “md5+隨機(jī)”方式加密  回復(fù)  更多評(píng)論   

          2014-07-14 11:15 by tangyue
          我愛中國

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          posts - 34, comments - 38, trackbacks - 0, articles - 0

          Copyright © 陳小東

          主站蜘蛛池模板: 木里| 延川县| 额敏县| 惠州市| 南阳市| 顺平县| 汤原县| 会理县| 梅河口市| 江门市| 万全县| 当涂县| 绥棱县| 大洼县| 阿克陶县| 鹤岗市| 博野县| 锡林浩特市| 茶陵县| 钦州市| 民权县| 罗田县| 陈巴尔虎旗| 扶沟县| 兴国县| 永和县| 贡嘎县| 潍坊市| 布尔津县| 龙泉市| 皋兰县| 淄博市| 新津县| 台州市| 宁南县| 双江| 睢宁县| 林州市| 阿克苏市| 宿州市| 永州市|