① 一般網頁中的用戶名和登錄密碼在傳輸過程中是通過什麼加密的
對於打開了某個論壇,輸入了用戶名和密碼,其實如果網站設計者重視安全問題的話一般會對輸入的用戶名和密碼進行加密,加密後的用戶名和密碼用一連串的字元表示,所以即使別人竊取了你的用戶名和密碼和密碼,他們如果不知道怎麼解密,他們只能得到一連串的字元,所以這也是一道防線。
接下來就是網路安全方面的問題:
數據加密(Data Encryption)技術
所謂加密(Encryption)是指將一個信息(或稱明文--plaintext) 經過加密鑰匙(Encrypt ionkey)及加密函數轉換,變成無意義的密文( ciphertext),而接收方則將此密文經過解密函數、解密鑰匙(Decryti on key)還原成明文。加密技術是網路安全技術的基石。
數據加密技術要求只有在指定的用戶或網路下,才能解除密碼而獲得原來的數據,這就需要給數據發送方和接受方以一些特殊的信息用於加解密,這就是所謂的密鑰。其密鑰的值是從大量的隨機數中選取的。按加密演算法分為專用密鑰和公開密鑰兩種。
專用密鑰,又稱為對稱密鑰或單密鑰,加密時使用同一個密鑰,即同一個演算法。如DES和MIT的Kerberos演算法。單密鑰是最簡單方式,通信雙方必須交換彼此密鑰,當需給對方發信息時,用自己的加密密鑰進行加密,而在接收方收到數據後,用對方所給的密鑰進行解密。這種方式在與多方通信時因為需要保存很多密鑰而變得很復雜,而且密鑰本身的安全就是一個問題。
DES是一種數據分組的加密演算法,它將數據分成長度為6 4位的數據塊,其中8位用作奇偶校驗,剩餘的56位作為密碼的長度。第一步將原文進行置換,得到6 4位的雜亂無章的數據組;第二步將其分成均等兩段 ;第三步用加密函數進行變換,並在給定的密鑰參數條件下,進行多次迭代而得到加密密文。
公開密鑰,又稱非對稱密鑰,加密時使用不同的密鑰,即不同的演算法,有一把公用的加密密鑰,有多把解密密鑰,如RSA演算法。
在計算機網路中,加密可分為"通信加密"(即傳輸過程中的數據加密)和"文件加密"(即存儲數據加密)。通信加密又有節點加密、鏈路加密和端--端加密3種。
①節點加密,從時間坐標來講,它在信息被傳入實際通信連接點 (Physical communication link)之前進行;從OSI 7層參考模型的坐標 (邏輯空間)來講,它在第一層、第二層之間進行; 從實施對象來講,是對相鄰兩節點之間傳輸的數據進行加密,不過它僅對報文加密,而不對報頭加密,以便於傳輸路由的選擇。
②鏈路加密(Link Encryption),它在數據鏈路層進行,是對相鄰節點之間的鏈路上所傳輸的數據進行加密,不僅對數據加密還對報頭加密。
③端--端加密(End-to-End Encryption),它在第六層或第七層進行 ,是為用戶之間傳送數據而提供的連續的保護。在始發節點上實施加密,在中介節點以密文形式傳輸,最後到達目的節點時才進行解密,這對防止拷貝網路軟體和軟體泄漏也很有效。
在OSI參考模型中,除會話層不能實施加密外,其他各層都可以實施一定的加密措施。但通常是在最高層上加密,即應用層上的每個應用都被密碼編碼進行修改,因此能對每個應用起到保密的作用,從而保護在應用層上的投資。假如在下面某一層上實施加密,如TCP層上,就只能對這層起到保護作用。
值得注意的是,能否切實有效地發揮加密機制的作用,關鍵的問題在於密鑰的管理,包括密鑰的生存、分發、安裝、保管、使用以及作廢全過程。
(1)數字簽名
公開密鑰的加密機制雖提供了良好的保密性,但難以鑒別發送者, 即任何得到公開密鑰的人都可以生成和發送報文。數字簽名機制提供了一種鑒別方法,以解決偽造、抵賴、冒充和篡改等問題。
數字簽名一般採用不對稱加密技術(如RSA),通過對整個明文進行某種變換,得到一個值,作為核實簽名。接收者使用發送者的公開密鑰對簽名進行解密運算,如其結果為明文,則簽名有效,證明對方的身份是真實的。當然,簽名也可以採用多種方式,例如,將簽名附在明文之後。數字簽名普遍用於銀行、電子貿易等。
數字簽名不同於手寫簽字:數字簽名隨文本的變化而變化,手寫簽字反映某個人個性特徵, 是不變的;數字簽名與文本信息是不可分割的,而手寫簽字是附加在文本之後的,與文本信息是分離的。
(2)Kerberos系統
Kerberos系統是美國麻省理工學院為Athena工程而設計的,為分布式計算環境提供一種對用戶雙方進行驗證的認證方法。
它的安全機制在於首先對發出請求的用戶進行身份驗證,確認其是否是合法的用戶;如是合法的用戶,再審核該用戶是否有權對他所請求的服務或主機進行訪問。從加密演算法上來講,其驗證是建立在對稱加密的基礎上的。
Kerberos系統在分布式計算環境中得到了廣泛的應用(如在Notes 中),這是因為它具有如下的特點:
①安全性高,Kerberos系統對用戶的口令進行加密後作為用戶的私鑰,從而避免了用戶的口令在網路上顯示傳輸,使得竊聽者難以在網路上取得相應的口令信息;
②透明性高,用戶在使用過程中,僅在登錄時要求輸入口令,與平常的操作完全一樣,Ker beros的存在對於合法用戶來說是透明的;
③可擴展性好,Kerberos為每一個服務提供認證,確保應用的安全。
Kerberos系統和看電影的過程有些相似,不同的是只有事先在Ker beros系統中登錄的客戶才可以申請服務,並且Kerberos要求申請到入場券的客戶就是到TGS(入場券分配伺服器)去要求得到最終服務的客戶。
Kerberos的認證協議過程如圖二所示。
Kerberos有其優點,同時也有其缺點,主要如下:
①、Kerberos伺服器與用戶共享的秘密是用戶的口令字,伺服器在回應時不驗證用戶的真實性,假設只有合法用戶擁有口令字。如攻擊者記錄申請回答報文,就易形成代碼本攻擊。
②、Kerberos伺服器與用戶共享的秘密是用戶的口令字,伺服器在回應時不驗證用戶的真實性,假設只有合法用戶擁有口令字。如攻擊者記錄申請回答報文,就易形成代碼本攻擊。
③、AS和TGS是集中式管理,容易形成瓶頸,系統的性能和安全也嚴重依賴於AS和TGS的性能和安全。在AS和TGS前應該有訪問控制,以增強AS和TGS的安全。
④、隨用戶數增加,密鑰管理較復雜。Kerberos擁有每個用戶的口令字的散列值,AS與TGS 負責戶間通信密鑰的分配。當N個用戶想同時通信時,仍需要N*(N-1)/2個密鑰
( 3 )、PGP演算法
PGP(Pretty Good Privacy)是作者hil Zimmermann提出的方案, 從80年代中期開始編寫的。公開密鑰和分組密鑰在同一個系統中,公開密鑰採用RSA加密演算法,實施對密鑰的管理;分組密鑰採用了IDEA演算法,實施對信息的加密。
PGP應用程序的第一個特點是它的速度快,效率高;另一個顯著特點就是它的可移植性出色,它可以在多種操作平台上運行。PGP主要具有加密文件、發送和接收加密的E-mail、數字簽名等。
(4)、PEM演算法
保密增強郵件(Private Enhanced Mail,PEM),是美國RSA實驗室基於RSA和DES演算法而開發的產品,其目的是為了增強個人的隱私功能, 目前在Internet網上得到了廣泛的應用,專為E-mail用戶提供如下兩類安全服務:
對所有報文都提供諸如:驗證、完整性、防抵 賴等安全服務功能; 提供可選的安全服務功能,如保密性等。
PEM對報文的處理經過如下過程:
第一步,作規范化處理:為了使PEM與MTA(報文傳輸代理)兼容,按S MTP協議對報文進行規范化處理;
第二步,MIC(Message Integrity Code)計算;
第三步,把處理過的報文轉化為適於SMTP系統傳輸的格式。
身份驗證技術
身份識別(Identification)是指定用戶向系統出示自己的身份證明過程。身份認證(Authertication)是系統查核用戶的身份證明的過程。人們常把這兩項工作統稱為身份驗證(或身份鑒別),是判明和確認通信雙方真實身份的兩個重要環節。
Web網上採用的安全技術
在Web網上實現網路安全一般有SHTTP/HTTP和SSL兩種方式。
(一)、SHTTP/HTTP
SHTTP/HTTP可以採用多種方式對信息進行封裝。封裝的內容包括加密、簽名和基於MAC 的認證。並且一個消息可以被反復封裝加密。此外,SHTTP還定義了包頭信息來進行密鑰傳輸、認證傳輸和相似的管理功能。SHTTP可以支持多種加密協議,還為程序員提供了靈活的編程環境。
SHTTP並不依賴於特定的密鑰證明系統,它目前支持RSA、帶內和帶外以及Kerberos密鑰交換。
(二)、SSL(安全套層) 安全套接層是一種利用公開密鑰技術的工業標准。SSL廣泛應用於Intranet和Internet 網,其產品包括由Netscape、Microsoft、IBM 、Open Market等公司提供的支持SSL的客戶機和伺服器,以及諸如Apa che-SSL等產品。
SSL提供三種基本的安全服務,它們都使用公開密鑰技術。
①信息私密,通過使用公開密鑰和對稱密鑰技術以達到信息私密。SSL客戶機和SSL伺服器之間的所有業務使用在SSL握手過程中建立的密鑰和演算法進行加密。這樣就防止了某些用戶通過使用IP packet sniffer工具非法竊聽。盡管packet sniffer仍能捕捉到通信的內容, 但卻無法破譯。 ②信息完整性,確保SSL業務全部達到目的。如果Internet成為可行的電子商業平台,應確保伺服器和客戶機之間的信息內容免受破壞。SSL利用機密共享和hash函數組提供信息完整性服務。③相互認證,是客戶機和伺服器相互識別的過程。它們的識別號用公開密鑰編碼,並在SSL握手時交換各自的識別號。為了驗證證明持有者是其合法用戶(而不是冒名用戶),SSL要求證明持有者在握手時對交換數據進行數字式標識。證明持有者對包括證明的所有信息數據進行標識以說明自己是證明的合法擁有者。這樣就防止了其他用戶冒名使用證明。證明本身並不提供認證,只有證明和密鑰一起才起作用。 ④SSL的安全性服務對終端用戶來講做到盡可能透明。一般情況下,用戶只需單擊桌面上的一個按鈕或聯接就可以與SSL的主機相連。與標準的HTTP連接申請不同,一台支持SSL的典型網路主機接受SSL連接的默認埠是443而不是80。
當客戶機連接該埠時,首先初始化握手協議,以建立一個SSL對話時段。握手結束後,將對通信加密,並檢查信息完整性,直到這個對話時段結束為止。每個SSL對話時段只發生一次握手。相比之下,HTTP 的每一次連接都要執行一次握手,導致通信效率降低。一次SSL握手將發生以下事件:
1.客戶機和伺服器交換X.509證明以便雙方相互確認。這個過程中可以交換全部的證明鏈,也可以選擇只交換一些底層的證明。證明的驗證包括:檢驗有效日期和驗證證明的簽名許可權。
2.客戶機隨機地產生一組密鑰,它們用於信息加密和MAC計算。這些密鑰要先通過伺服器的公開密鑰加密再送往伺服器。總共有四個密鑰分別用於伺服器到客戶機以及客戶機到伺服器的通信。
3.信息加密演算法(用於加密)和hash函數(用於確保信息完整性)是綜合在一起使用的。Netscape的SSL實現方案是:客戶機提供自己支持的所有演算法清單,伺服器選擇它認為最有效的密碼。伺服器管理者可以使用或禁止某些特定的密碼。
② 6、37網游網頁Post登陸演算法分析【Post/Js逆向筆記】
事先說明:發布文章內容,僅為自己自學逆向分析做一個記錄,便於以後鞏固學習逆向分析。本人為逆向學習小白,發布的內容都是簡單的逆向分析。請大佬們手下留情!
1、分析的登陸網站
2、使用工具
3、開始post分析
4、password解密
將關鍵詞"password"輸入到全局搜索中,獲取到許多password的數據。經過一個個排查試錯後。
發現"h.password = td(f)"這個較為可疑,td函數中傳入一個f變數,賦值給h對象中的password。
點擊進入這個js代碼中,設置斷點看看能否調試!
斷點設置正確,當前在_action函數中斷點跟隨到h.password = td(f),但是沒有執行函數,目前h.password的數據為之前輸入的密碼:a123456。
按F10執行後
此時h.password就是加密後的數據了"==",說明函數td就是給密碼加密的函數。
點擊進入td函數中,可以看到這個加密函數調用了__rsa函數,也是在自身上面定義好的,那麼直接把這個JS文件復制出來,放入鬼鬼調試工具中。
調試後,可以直接獲取到密碼加密後的數據。在td函數中有隨機數,所以每次進行加密後的數據,都是不一樣的。
5、callback解密
通過多次抓包測試,可以發現callback: jQuery183011611722936955027_1611911356694這樣的數據,通過下劃線可以分割成一個固定的值和一個時間戳。
jQuery183011611722936955027_「時間戳」
其餘的參數固定即可!
需要注意的是,多次抓包後,在點擊登陸後,會觸發圖片驗證碼!
③ QQ空間登陸加密密碼演算法是什麼
QQ空間現在採用的是動態加密,加密結果和驗證碼有密切關系,
也就是說是:密碼+演算法+驗證碼在一起,加密演算法如下:
public static string smethod_0(string s)
{
MD5 mD = MD5.Create();
byte[] bytes = Encoding.ASCII.GetBytes(s);
byte[] array = mD.ComputeHash(bytes);
StringBuilder stringBuilder = new StringBuilder();
byte[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
byte b = array2[i];
stringBuilder.Append(b.ToString("x").PadLeft(2, '0'));
}
return stringBuilder.ToString().ToUpper();
}
public static byte[] EncyptMD5Bytes(string s)
{
MD5 mD = MD5.Create();
byte[] bytes = Encoding.ASCII.GetBytes(s);
return mD.ComputeHash(bytes);
}
public static string smethod_1(byte[] s)
{
MD5 mD = MD5.Create();
byte[] array = mD.ComputeHash(s);
StringBuilder stringBuilder = new StringBuilder();
byte[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
byte b = array2[i];
stringBuilder.Append(b.ToString("x").PadLeft(2, '0'));
}
return stringBuilder.ToString().ToUpper();
}
public static string EncryptQQWebMd5(string s)
{
MD5 mD = MD5.Create();
byte[] bytes = Encoding.ASCII.GetBytes(s);
byte[] array = mD.ComputeHash(bytes);
StringBuilder stringBuilder = new StringBuilder();
byte[] array2 = array;
for (int i = 0; i < array2.Length; i++)
{
byte b = array2[i];
stringBuilder.Append("\\x");
stringBuilder.Append(b.ToString("x2"));
}
return stringBuilder.ToString();
}
public static string EncryptOld(string password, string verifyCode)
{
return smethod_0(EncyptMD5_3_16(password) + verifyCode.ToUpper());
}
public static string Encrypt(string qq, string password, string verifyCode)
{
return Encrypt((long)Convert.ToDouble(qq), password, verifyCode);
}
public class ByteBuffer
{
private byte[] byte_0;
public Stream BaseStream;
public ByteBuffer()
{
this.BaseStream = new MemoryStream();
this.byte_0 = new byte[16];
}
public virtual long Seek(int offset, SeekOrigin origin)
{
return this.BaseStream.Seek((long)offset, origin);
}
public bool Peek()
{
return this.BaseStream.Position < this.BaseStream.Length;
}
public byte[] ToByteArray()
{
//long position = this.BaseStream.Position;
//this.BaseStream.Position = 0L;
//byte[] array = new byte[(int)((object)((IntPtr)this.BaseStream.Length))];
//this.BaseStream.Read(array, 0, array.Length);
//this.BaseStream.Position = position;
//return array;
long position = this.BaseStream.Position;
this.BaseStream.Position = 0L;
byte[] buffer = new byte[this.BaseStream.Length];
this.BaseStream.Read(buffer, 0, buffer.Length);
this.BaseStream.Position = position;
return buffer;
}
public void Put(bool value)
{
this.byte_0[0] = value ? ((byte)1) : ((byte)0);
this.BaseStream.Write(this.byte_0, 0, 1);
}
public void Put(byte value)
{
this.BaseStream.WriteByte(value);
}
public void Put(byte[] value)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
this.BaseStream.Write(value, 0, value.Length);
}
public void PutInt(int value)
{
this.PutInt((uint)value);
}
public void PutInt(uint value)
{
this.byte_0[0] = (byte)(value >> 24);
this.byte_0[1] = (byte)(value >> 16);
this.byte_0[2] = (byte)(value >> 8);
this.byte_0[3] = (byte)value;
this.BaseStream.Write(this.byte_0, 0, 4);
}
public void PutInt(int index, uint value)
{
int offset = (int)this.BaseStream.Position;
this.Seek(index, SeekOrigin.Begin);
this.PutInt(value);
this.Seek(offset, SeekOrigin.Begin);
}
public byte Get()
{
return (byte)this.BaseStream.ReadByte();
}
}
public static string Encrypt(long qq, string password, string verifyCode)
{
ByteBuffer byteBuffer = new ByteBuffer();
byteBuffer.Put(EncyptMD5Bytes(password));
byteBuffer.PutInt(0);
byteBuffer.PutInt((uint)qq);
EncryptQQWebMd5(password);
byte[] s = byteBuffer.ToByteArray();
string str = smethod_1(s);
return smethod_0(str + verifyCode.ToUpper());
}
上面的加密演算法,調用方法是:string str = Encrypt(QQ號, QQ密碼, 驗證碼);
加密後的密碼會返回到str中,然後使用返回的密碼進行登錄。
註:QQ空間登錄是採用的GET而不是POST。
④ 如何實現一個安全的Web登陸
對於 Web 應用程序,安全登錄是很重要的。但是目前大多數 Web 系統在發送登錄密碼時是發送的明文,這樣很容易被入侵者監聽到密碼。當然,通過 SSL
來實現安全連接是個不錯的方法,但是很多情況下我們沒辦法將伺服器設置為帶有 SSL 的 Web 伺服器。因此如果在登錄系統中加入安全登錄機制,則可以在沒有 SSL
的 Web 伺服器上實現安全登錄。
要實現安全登錄,可以採用下面三種方法,一種基於非對稱加密演算法,一種基於對稱加密演算法,最後一種基於散列演算法。
非對稱加密演算法中,目前最常用的是 RSA 演算法和
ECC(橢圓曲線加密)演算法。要採用非對稱加密演算法實現安全登錄的話,首先需要在客戶端向伺服器端請求登錄頁面時,伺服器生成公鑰和私鑰,然後將公鑰隨登錄頁面一起傳遞給客戶端瀏覽器,當用戶輸入完用戶名密碼點擊登錄時,登錄頁面中的
JavaScript
調用非對稱加密演算法對用戶名和密碼用用公鑰進行加密。然後再提交到伺服器端,伺服器端利用私鑰進行解密,再跟資料庫中的用戶名密碼進行比較,如果一致,則登錄成功,否則登錄失敗。
對稱加密演算法比非對稱加密演算法要快得多,但是對稱加密演算法需要數據發送方和接受方共用一個密鑰,密鑰是不能通過不安全的網路直接傳遞的,否則密鑰和加密以後的數據如果同時監聽到的話,入侵者就可以直接利用監聽到的密鑰來對加密後的信息進行解密了。
如何用 hmac
演算法實現安全登錄。首先在客戶端向伺服器端請求登錄頁面時,伺服器端生成一個隨機字元串,連同登錄頁面一同發送給客戶端瀏覽器,當用戶輸入完用戶名密碼後,將密碼採用
MD5 或者 SHA1 來生成散列值作為密鑰,伺服器端發送來的隨機字元串作為消息數據,進行 hmac
運算。然後將結果提交給伺服器。之所以要對用戶輸入的密碼進行散列後再作為密鑰,而不是直接作為密鑰,是為了保證密鑰足夠長,而又不會太長。伺服器端接受到客戶端提交的數據後,將保存在伺服器端的隨機字元串和用戶密碼進行相同的運算,然後進行比較,如果結果一致,則認為登錄成功,否則登錄失敗。當然如果不用
hmac 演算法,直接將密碼和伺服器端生成的隨機數合並以後再做 MD5 或者 SHA1,應該也是可以的。
這里客戶端每次請求時伺服器端發送的隨機字元串都是不同的,因此即使入侵者監聽到了這個隨機字元串和加密後的提交的數據,它也無法再次提交相同的數據通過驗證。而且通過監聽到的數據也無法計算出密鑰,所以也就無法偽造登錄信息了。
對稱和非對稱加密演算法不僅適用於登錄驗證,還適合用於最初的密碼設置和以後密碼修改的過程中,而散列演算法僅適用於登錄驗證。但是散列演算法要比對稱和非對稱加密演算法效率高。
⑤ 如何實現網站登錄的密碼驗證過程
問題1.把用戶用戶名和加密後的密碼存入資料庫,用戶需要驗證時,將用戶輸入的密碼加密,與資料庫中的加密密碼比較。
問題2.md5演算法
具體演算法原理:
對MD5演算法簡要的敘述可以為:MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,演算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。
在MD5演算法中,首先需要對信息進行填充,使其位長對512求余的結果等於448。因此,信息的位長(Bits Length)將被擴展至N*512+448,N為一個非負整數,N可以是零。填充的方法如下,在信息的後面填充一個1和無數個0,直到滿足上面的條件時才停止用0對信息的填充。然後,在這個結果後面附加一個以64位二進製表示的填充前信息長度。經過這兩步的處理,信息的位長=N*512+448+64=(N+1)*512,即長度恰好是512的整數倍。這樣做的原因是為滿足後面處理中對信息長度的要求。總體流程如下圖所示,
表示第i個分組,每次的運算都由前一輪的128位結果值和第i塊512bit值進行運算。初始的128位值為初試鏈接變數,這些參數用於第一輪的運算,以大端位元組序來表示,他們分別為:A=0x01234567,B=0x89ABCDEF,C=0xFEDCBA98,D=0x76543210。
MD5演算法的整體流程圖[1]
每一分組的演算法流程如下:
第一分組需要將上面四個鏈接變數復制到另外四個變數中:A到a,B到b,C到c,D到d。從第二分組開始的變數為上一分組的運算結果。
主循環有四輪(MD4隻有三輪),每輪循環都很相似。第一輪進行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函數運算,然後將所得結果加上第四個變數,文本的一個子分組和一個常數。再將所得結果向左環移一個不定的數,並加上a、b、c或d中之一。最後用該結果取代a、b、c或d中之一。
以下是每次操作中用到的四個非線性函數(每輪一個)。
F(X,Y,Z) =(X&Y)|((~X)&Z)
G(X,Y,Z) =(X&Z)|(Y&(~Z))
H(X,Y,Z) =X^Y^Z
I(X,Y,Z)=Y^(X|(~Z))
(&;是與,|是或,~是非,^是異或)
這四個函數的說明:如果X、Y和Z的對應位是獨立和均勻的,那麼結果的每一位也應是獨立和均勻的。
F是一個逐位運算的函數。即,如果X,那麼Y,否則Z。函數H是逐位奇偶操作符。
假設Mj表示消息的第j個子分組(從0到15),常數ti是4294967296*abs(sin(i))的整數部分,i取值從1到64,單位是弧度。(4294967296等於2的32次方)
FF(a,b,c,d,Mj,s,ti)表示 a = b + ((a + F(b,c,d) + Mj + ti) << s)
GG(a,b,c,d,Mj,s,ti)表示 a = b + ((a + G(b,c,d) + Mj + ti) << s)
HH(a,b,c,d,Mj,s,ti)表示 a = b + ((a + H(b,c,d) + Mj + ti) << s)
Ⅱ(a,b,c,d,Mj,s,ti)表示 a = b + ((a + I(b,c,d) + Mj + ti) << s)
這四輪(64步)是:
第一輪
FF(a,b,c,d,M0,7,0xd76aa478)
FF(d,a,b,c,M1,12,0xe8c7b756)
FF(c,d,a,b,M2,17,0x242070db)
FF(b,c,d,a,M3,22,0xc1bdceee)
FF(a,b,c,d,M4,7,0xf57c0faf)
FF(d,a,b,c,M5,12,0x4787c62a)
FF(c,d,a,b,M6,17,0xa8304613)
FF(b,c,d,a,M7,22,0xfd469501)
FF(a,b,c,d,M8,7,0x698098d8)
FF(d,a,b,c,M9,12,0x8b44f7af)
FF(c,d,a,b,M10,17,0xffff5bb1)
FF(b,c,d,a,M11,22,0x895cd7be)
FF(a,b,c,d,M12,7,0x6b901122)
FF(d,a,b,c,M13,12,0xfd987193)
FF(c,d,a,b,M14,17,0xa679438e)
FF(b,c,d,a,M15,22,0x49b40821)
第二輪
GG(a,b,c,d,M1,5,0xf61e2562)
GG(d,a,b,c,M6,9,0xc040b340)
GG(c,d,a,b,M11,14,0x265e5a51)
GG(b,c,d,a,M0,20,0xe9b6c7aa)
GG(a,b,c,d,M5,5,0xd62f105d)
GG(d,a,b,c,M10,9,0x02441453)
GG(c,d,a,b,M15,14,0xd8a1e681)
GG(b,c,d,a,M4,20,0xe7d3fbc8)
GG(a,b,c,d,M9,5,0x21e1cde6)
GG(d,a,b,c,M14,9,0xc33707d6)
GG(c,d,a,b,M3,14,0xf4d50d87)
GG(b,c,d,a,M8,20,0x455a14ed)
GG(a,b,c,d,M13,5,0xa9e3e905)
GG(d,a,b,c,M2,9,0xfcefa3f8)
GG(c,d,a,b,M7,14,0x676f02d9)
GG(b,c,d,a,M12,20,0x8d2a4c8a)
第三輪
HH(a,b,c,d,M5,4,0xfffa3942)
HH(d,a,b,c,M8,11,0x8771f681)
HH(c,d,a,b,M11,16,0x6d9d6122)
HH(b,c,d,a,M14,23,0xfde5380c)
HH(a,b,c,d,M1,4,0xa4beea44)
HH(d,a,b,c,M4,11,0x4bdecfa9)
HH(c,d,a,b,M7,16,0xf6bb4b60)
HH(b,c,d,a,M10,23,0xbebfbc70)
HH(a,b,c,d,M13,4,0x289b7ec6)
HH(d,a,b,c,M0,11,0xeaa127fa)
HH(c,d,a,b,M3,16,0xd4ef3085)
HH(b,c,d,a,M6,23,0x04881d05)
HH(a,b,c,d,M9,4,0xd9d4d039)
HH(d,a,b,c,M12,11,0xe6db99e5)
HH(c,d,a,b,M15,16,0x1fa27cf8)
HH(b,c,d,a,M2,23,0xc4ac5665)
第四輪
Ⅱ(a,b,c,d,M0,6,0xf4292244)
Ⅱ(d,a,b,c,M7,10,0x432aff97)
Ⅱ(c,d,a,b,M14,15,0xab9423a7)
Ⅱ(b,c,d,a,M5,21,0xfc93a039)
Ⅱ(a,b,c,d,M12,6,0x655b59c3)
Ⅱ(d,a,b,c,M3,10,0x8f0ccc92)
Ⅱ(c,d,a,b,M10,15,0xffeff47d)
Ⅱ(b,c,d,a,M1,21,0x85845dd1)
Ⅱ(a,b,c,d,M8,6,0x6fa87e4f)
Ⅱ(d,a,b,c,M15,10,0xfe2ce6e0)
Ⅱ(c,d,a,b,M6,15,0xa3014314)
Ⅱ(b,c,d,a,M13,21,0x4e0811a1)
Ⅱ(a,b,c,d,M4,6,0xf7537e82)
Ⅱ(d,a,b,c,M11,10,0xbd3af235)
Ⅱ(c,d,a,b,M2,15,0x2ad7d2bb)
Ⅱ(b,c,d,a,M9,21,0xeb86d391)
所有這些完成之後,將A、B、C、D分別加上a、b、c、d。然後用下一分組數據繼續運行演算法,最後的輸出是A、B、C和D的級聯。
當你按照我上面所說的方法實現MD5演算法以後,你可以用以下幾個信息對你做出來的程序作一個簡單的測試,看看程序有沒有錯誤。
MD5 ("") =
MD5 ("a") =
MD5 ("abc") =
MD5 ("message digest") =
MD5 ("abcdefghijklmnopqrstuvwxyz") =
MD5 ("") =
⑥ 關於用戶登錄方式
一、了解Windows XP的
幾種登錄類型
1. 互動式登錄
互動式登錄是我們平常登錄時最常見的類型,就是用戶通過相應的用戶賬號(User Account)和密碼在本機進行登錄。有些網友認為「互動式登錄」就是「本地登錄」,其實這是錯誤的。「互動式登錄」還包括「域賬號登錄」,而「本地登錄」僅限於「本地賬號登錄」。
這里有必要提及的是,通過終端服務和遠程桌面登錄主機,可以看做「互動式登錄」,其驗證的原理是一樣的。
在互動式登錄時,系統會首先檢驗登錄的用戶賬號類型,是本地用戶賬號(Local User Account),還是域用戶賬號(Domain User Account),再採用相應的驗證機制。因為不同的用戶賬號類型,其處理方法也不同。
◇ 本地用戶賬號
採用本地用戶賬號登錄,系統會通過存儲在本機SAM資料庫中的信息進行驗證。所以也就是為什麼Windows2000忘記Administrator密碼時可以用刪除SAM文件的方法來解決。不過對於Windows XP則不可以,可能是出於安全方面的考慮吧。用本地用戶賬號登錄後,只能訪問到具有訪問許可權的本地資源。(圖1)
圖1
◇域用戶賬號
採用域用戶賬號登錄,系統則通過存儲在域控制器的活動目錄中的數據進行驗證。如果該用戶賬號有效,則登錄後可以訪問到整個域中具有訪問許可權的資源。
小提示:如果計算機加入域以後,登錄對話框就會顯示「登錄到:」項目,可以從中選擇登錄到域還是登錄到本機。
2. 網路登錄
如果計算機加入到工作組或域,當要訪問其他計算機的資源時,就需要「網路登錄」了。如圖2,當要登錄名稱為Heelen的主機時,輸入該主機的用戶名稱和密碼後進行驗證。這里需要提醒的是,輸入的用戶賬號必須是對方主機上的,而非自己主機上的用戶賬號。因為進行網路登錄時,用戶賬號的有效性是由受訪主機控制的。
圖2
3. 服務登錄
服務登錄是一種特殊的登錄方式。平時,系統啟動服務和程序時,都是先以某些用戶賬號進行登錄後運行的,這些用戶賬號可以是域用戶賬號、本地用戶賬號或SYSTEM賬號。採用不同的用戶賬號登錄,其對系統的訪問、控制許可權也不同,而且,用本地用戶賬號登錄,只能訪問到具有訪問許可權的本地資源,不能訪問到其他計算機上的資源,這點和「互動式登錄」類似。
從圖3的任務管理器中可以看到,系統的進程所使用的賬號是不同的。當系統啟動時,一些基與Win32的服務會被預先登錄到系統上,從而實現對系統的訪問和控制。運行Services.msc,可以設置這些服務。由於系統服務有著舉足輕重的地位,一般都以SYSTEM賬號登錄,所以對系統有絕對的控制許可權,因此很多病毒和木馬也爭著加入這個貴族體系中。除了SYSTEM,有些服務還以Local Service和Network Service這兩個賬號登錄。而在系統初始化後,用戶運行的一切程序都是以用戶本身賬號登錄的。
圖3
從上面講到的原理不難看出,為什麼很多電腦文章告訴一般用戶,平時使用計算機時要以Users組的用戶登錄,因為即使運行了病毒、木馬程序,由於受到登錄用戶賬號相應的許可權限制,最多也只能破壞屬於用戶本身的資源,而對維護系統安全和穩定性的重要信息無破壞性。
4. 批處理登錄
批處理登錄一般用戶很少用到,通常被執行批處理操作的程序所使用。在執行批處理登錄時,所用賬號要具有批處理工作的權利,否則不能進行登錄。
平常我們接觸最多的是「互動式登錄」,所以下面筆者將為大家詳細講解「互動式登錄」的原理。
二、互動式登錄,系統用了哪些組件
1. Winlogon.exe
Winlogon.exe是「互動式登錄」時最重要的組件,它是一個安全進程,負責如下工作:
◇載入其他登錄組件。
◇提供同安全相關的用戶操作圖形界面,以便用戶能進行登錄或注銷等相關操作。
◇根據需要,同GINA發送必要信息。
2. GINA
GINA的全稱為「Graphical Identification and Authentication」——圖形化識別和驗證。它是幾個動態資料庫文件,被Winlogon.exe所調用,為其提供能夠對用戶身份進行識別和驗證的函數,並將用戶的賬號和密碼反饋給Winlogon.exe。在登錄過程中,「歡迎屏幕」和「登錄對話框」就是GINA顯示的。
一些主題設置軟體,例如StyleXP,可以指定Winlogon.exe載入商家自己開發的GINA,從而提供不同的Windows XP的登錄界面。由於這個可修改性,現在出現了盜取賬號和密碼的木馬。
一種是針對「歡迎屏幕」登錄方式的木馬,它模擬了Windows XP的歡迎界面。當用戶輸入密碼後,就被木馬程序所獲取,而用戶卻全然不知。所以建議大家不要以歡迎屏幕來登錄,且要設置「安全登錄」。
另一種是針對登錄對話框的GINA木馬,其原理是在登錄時載入,以盜取用戶的賬號和密碼,然後把這些信息保存到%systemroot%system32下的WinEggDrop.dat中。該木馬會屏蔽系統以「歡迎屏幕」方式登錄和「用戶切換」功能,也會屏蔽「Ctrl-Alt-Delete」的安全登錄提示。
用戶也不用太擔心被安裝了GINA木馬,筆者在這里提供解決方案給大家參考:
◇正所謂「解鈴還需系鈴人」,要查看自己電腦是否安裝過GINA木馬,可以下載一個GINA木馬程序,然後運行InstGina -view,可以查看系統中GinaDLL鍵值是否被安裝過DLL,主要用來查看系統是否被人安裝了Gina木馬作為登錄所用。如果不幸被安裝了GINA木馬,可以運行InstGina -Remove來卸載它。
3. LSA服務
LSA的全稱為「Local Security Authority」——本地安全授權,Windows系統中一個相當重要的服務,所有安全認證相關的處理都要通過這個服務。它從Winlogon.exe中獲取用戶的賬號和密碼,然後經過密鑰機制處理,並和存儲在賬號資料庫中的密鑰進行對比,如果對比的結果匹配,LSA就認為用戶的身份有效,允許用戶登錄計算機。如果對比的結果不匹配,LSA就認為用戶的身份無效。這時用戶就無法登錄計算機。
怎麼看這三個字母有些眼熟?對了,這個就是和前陣子鬧得沸沸揚揚的「震盪波」 扯上關系的服務。「震盪波」蠕蟲就是利用LSA遠程緩沖區溢出漏洞而獲得系統最高許可權SYSTEM來攻擊電腦的。解決的方法網上很多資料,這里就不多講了。
4. SAM資料庫
SAM的全稱為「Security Account Manager」——安全賬號管理器,是一個被保護的子系統,它通過存儲在計算機注冊表中的安全賬號來管理用戶和用戶組的信息。我們可以把SAM看成一個賬號資料庫。對於沒有加入到域的計算機來說,它存儲在本地,而對於加入到域的計算機,它存儲在域控制器上。
如果用戶試圖登錄本機,那麼系統會使用存儲在本機上的SAM資料庫中的賬號信息同用戶提供的信息進行比較;如果用戶試圖登錄到域,那麼系統會使用存儲在域控制器中上的SAM資料庫中的賬號信息同用戶提供的信息進行比較。
5. Net Logon服務
Net Logon服務主要和NTLM(NT LAN Manager,Windows NT 4.0 的默認驗證協議)協同使用,用戶驗證Windows NT域控制器上的SAM資料庫上的信息同用戶提供的信息是否匹配。NTLM協議主要用於實現同Windows NT的兼容性而保留的。
6. KDC服務
KDC(Kerberos Key Distribution Center——Kerberos密鑰發布中心)服務主要同Kerberos認證協議協同使用,用於在整個活動目錄范圍內對用戶的登錄進行驗證。如果你確保整個域中沒有Windows NT計算機,可以只使用Kerberos協議,以確保最大的安全性。該服務要在Active Directory服務啟動後才能啟用。
7. Active Directory服務
如果計算機加入到Windows 2000或Windows 2003域中,則需啟動該服務以對Active Directory(活動目錄)功能的支持。
三、登錄前後,Winlogon到底幹了什麼
如果用戶設置了「安全登錄」,在Winlogon初始化時,會在系統中注冊一個SAS (Secure Attention Sequence——安全警告序列)。SAS是一組組合鍵,默認情況下為Ctrl-Alt-Delete。它的作用是確保用戶互動式登錄時輸入的信息被系統所接受,而不會被其他程序所獲取。所以說,使用「安全登錄」進行登錄,可以確保用戶的賬號和密碼不會被黑客盜取。要啟用「安全登錄」的功能,可以運行「Control userpasswords2」命令,打開「用戶賬戶」對話框,選擇「高級」。(如圖4)選中「要求用戶按Ctrl-Alt-Delete」選項後確定即可。以後,在每次登錄對話框出現前都有一個提示,要求用戶按Ctrl-Alt-Delete組合鍵,目的是為了在登錄時出現Windows XP的GINA登錄對話框,因為只有系統本身的GINA才能截獲這個組合鍵信息。而如前面講到的GINA木馬,會屏蔽掉「安全登錄」的提示,所以如果「安全登錄」的提示無故被屏蔽也是發現木馬的一個前兆。「安全登錄」功能早在Windows 2000時就被應用於保護系統安全性。
圖4
在Winlogon注冊了SAS後,就調用GINA生成3個桌面系統,在用戶需要的時候使用,它們分別為:
◇Winlogon桌面 用戶在進入登錄界面時,就進入了Winlogon桌面。而我們看到的登錄對話框,只是GINA負責顯示的。
如果用戶取消以「歡迎屏幕」方式登錄,在進入Windows XP中任何時候按下「Ctrl-Alt-Delete」,都會激活Winlogon桌面,並顯示圖5的「Windows安全」對話框(注意,Winlogon桌面並不等同對話框,對話框只是Winlogon調用其他程序來顯示的)。
圖5
◇用戶桌面 用戶桌面就是我們日常操作的桌面,它是系統最主要的桌面系統。用戶需要提供正確的賬號和密碼,成功登錄後才能顯示「用戶桌面」。而且,不同的用戶,Winlogon會根據注冊表中的信息和用戶配置文件來初始化用戶桌面。
◇屏幕保護桌面 屏幕保護桌面就是屏幕保護,包括「系統屏幕保護」和「用戶屏幕保護」。在啟用了「系統屏幕保護」的前提下,用戶未進行登錄並且長時間無操作,系統就會進入「系統屏幕保護」;而對於「用戶屏幕保護」來說,用戶要登錄後才能訪問,不同的用戶可以設置不同的「用戶屏幕保護」。
四、想登錄,也要過GINA這一關
在「互動式登錄」過程中,Winlogon調用了GINA組文件,把用戶提供的賬號和密碼傳達給GINA,由GINA負責對賬號和密碼的有效性進行驗證,然後把驗證結果反饋給Winlogon程序。在與Winlogon.exe對話時,GINA會首先確定Winlogon.exe的當前狀態,再根據不同狀態來執行不同的驗證工作。通常Winlogon.exe有三種狀態:
1. 已登錄狀態
顧名思義,用戶在成功登錄後,就進入了「已登錄狀態」。在此狀態下,用戶可以執行有控制許可權的任何操作。
2. 已注銷狀態
用戶在已登錄狀態下,選擇「注銷」命令後,就進入了「已注銷狀態」,並顯示Winlogon桌面,而由GINA負責顯示登錄對話框或歡迎屏幕。
3. 已鎖定狀態
當用戶按下「Win+L」鍵鎖定計算機後,就進入了「已鎖定狀態」。在此狀態下,GINA負責顯示可供用戶登錄的對話框。此時用戶有兩種選擇,一種是輸入當前用戶的密碼返回「已登錄狀態」,另一種是輸入管理員賬號和密碼,返回「已注銷狀態」,但原用戶狀態和未保存數據丟失。
五、登錄到本機的過程
1. 用戶首先按Ctrl+Alt+Del組合鍵。
2. Winlogon檢測到用戶按下SAS鍵,就調用GINA,由GINA顯示登錄對話框,以便用戶輸入賬號和密碼。
3. 用戶輸入賬號和密碼,確定後,GINA把信息發送給LSA進行驗證。
4. 在用戶登錄到本機的情況下,LSA會調用Msv1_0.dll這個驗證程序包,將用戶信息處理後生成密鑰,同SAM資料庫中存儲的密鑰進行對比。
5. 如果對比後發現用戶有效,SAM會將用戶的SID(Security Identifier——安全標識),用戶所屬用戶組的SID,和其他一些相關信息發送給LSA。
6. LSA將收到的SID信息創建安全訪問令牌,然後將令牌的句柄和登錄信息發送給Winlogon.exe。
7. Winlogon.exe對用戶登錄稍作處理後,完成整個登錄過程。
六、登錄到域的過程
登錄到域的驗證過程,對於不同的驗證協議也有不同的驗證方法。如果域控制器是Windows NT 4.0,那麼使用的是NTLM驗證協議,其驗證過程和前面的「登錄到本機的過程」差不多,區別就在於驗證賬號的工作不是在本地SAM資料庫中進行,而是在域控制器中進行;而對於Windows 2000和Windows 2003域控制器來說,使用的一般為更安全可靠的Kerberos V5協議。通過這種協議登錄到域,要向域控制器證明自己的域賬號有效,用戶需先申請允許請求該域的TGS(Ticket-Granting Service——票據授予服務)。獲准之後,用戶就會為所要登錄的計算機申請一個會話票據,最後還需申請允許進入那台計算機的本地系統服務。
其過程如下:
1. 用戶首先按Ctrl+Alt+Del組合鍵。
2. Winlogon檢測到用戶按下SAS鍵,就調用GINA,由GINA顯示登錄對話框,以便用戶輸入賬號和密碼。
3. 用戶選擇所要登錄的域和填寫賬號與密碼,確定後,GINA將用戶輸入的信息發送給LSA進行驗證。
4. 在用戶登錄到本機的情況下,LSA將請求發送給Kerberos驗證程序包。通過散列演算法,根據用戶信息生成一個密鑰,並將密鑰存儲在證書緩存區中。
5. Kerberos驗證程序向KDC(Key Distribution Center——密鑰分配中心)發送一個包含用戶身份信息和驗證預處理數據的驗證服務請求,其中包含用戶證書和散列演算法加密時間的標記。
6. KDC接收到數據後,利用自己的密鑰對請求中的時間標記進行解密,通過解密的時間標記是否正確,就可以判斷用戶是否有效。
7. 如果用戶有效,KDC將向用戶發送一個TGT(Ticket-Granting Ticket——票據授予票據)。該TGT(AS_REP)將用戶的密鑰進行解密,其中包含會話密鑰、該會話密鑰指向的用戶名稱、該票據的最大生命期以及其他一些可能需要的數據和設置等。用戶所申請的票據在KDC的密鑰中被加密,並附著在AS_REP中。在TGT的授權數據部分包含用戶賬號的SID以及該用戶所屬的全局組和通用組的SID。注意,返回到LSA的SID包含用戶的訪問令牌。票據的最大生命期是由域策略決定的。如果票據在活動的會話中超過期限,用戶就必須申請新的票據。
8. 當用戶試圖訪問資源時,客戶系統使用TGT從域控制器上的Kerberos TGS請求服務票據(TGS_REQ)。然後TGS將服務票據(TGS_REP)發送給客戶。該服務票據是使用伺服器的密鑰進行加密的。同時,SID被Kerberos服務從TGT復制到所有的Kerberos服務包含的子序列服務票據中。
9. 客戶將票據直接提交到需要訪問的網路服務上,通過服務票據就能證明用戶的標識和針對該服務的許可權,以及服務對應用戶的標識。
七、我要偷懶——設置自動登錄
為了安全起見,平時我們進入Windows XP時,都要輸入賬號和密碼。而一般我們都是使用一個固定的賬號登錄的。面對每次煩瑣的輸入密碼,有的朋友乾脆設置為空密碼或者類似「123」等弱口令,而這些賬號也多數為管理員賬號。殊不知黑客用一般的掃描工具,很容易就能掃描到一段IP段中所有弱口令的計算機。
所以,還是建議大家要把密碼盡量設置得復雜些。如果怕麻煩,可以設置自動登錄,不過自動登錄也是很不安全的。因為自動登錄意味著能直接接觸計算機的人都能進入系統;另一方面,賬號和密碼是明文保存在注冊表中的,所以任何人,只要具有訪問注冊表的許可權,都可以通過網路查看。因此如果要設置登錄,最好不要設置為管理員賬號,可以設置為USERS組的用戶賬號。設置自動登錄的方法是:運行「Control userpasswords2」,在「用戶賬戶」窗口中取消「要使用本機,用戶必須輸入用戶名和密碼」選項,確定後會出現一個對話框,輸入要自動登錄的賬號和密碼即可。注意,這里不對密碼進行驗證,用戶要確保密碼和賬號的正確性。