概述ASP.NET Membership
本來打算寫一篇介紹如何實現用戶登錄功能的文章的,但因為時間有限,所以先介紹一下密碼的散列和ASP.NET Membership
1.加Salt散列
我們知道,如果直接對密碼進行散列,那么黑客(統稱那些有能力竊取用戶數據并企圖得到用戶密碼的人)可以對一個已知密碼進行散列,然后通過對比散列值得到某用戶的密碼。換句話說,雖然黑客不能取得某特定用戶的密碼,但他可以知道使用特定密碼的用戶有哪些。
加Salt可以一定程度上解決這一問題。所謂加Salt,就是加點“佐料”。其基本想法是這樣的——當用戶***提供密碼時(通常是注冊時),由系統自動往這個密碼里撒一些“佐料”,然后再散列。而當用戶登錄時,系統為用戶提供的代碼撒上同樣的“佐料”,然后散列,再比較散列值,已確定密碼是否正確。
這里的“佐料”被稱作“Salt值”,這個值是由系統隨機生成的,并且只有系統知道。這樣,即便兩個用戶使用了同一個密碼,由于系統為它們生成的salt值不同,他們的散列值也是不同的。即便黑客可以通過自己的密碼和自己生成的散列值來找具有特定密碼的用戶,但這個幾率太小了(密碼和salt值都得和黑客使用的一樣才行)。
下面詳細介紹一下加Salt散列的過程。介紹之前先強調一點,前面說過,驗證密碼時要使用和最初散列密碼時使用“相同的”佐料。所以Salt值是要存放在數據庫里的。
2.ASP.NET Membership中的相關代碼
(省略關于Membership的介紹若干字)
本文Anders Liu僅研究了SqlMembershipProvider,該類位于System.Web.dll,System.Web.Security命名空間中。
首先,要使用Membership,必須先用aspnet_regsql.exe命令來配置數據庫,該工具會向現有數據庫中添加一系列表和存儲過程等,配置好的數據庫中有一個表aspnet_Membership,就是用于存放用戶帳戶信息的。其中我們所關注的列有三個——Password、PasswordFormat和PasswordSalt。
Password存放的是密碼的散列值,PasswordFormat存放用于散列密碼所使用的算法,PasswordSalt就是系統生成的Salt值了。
3.小結
本文只是簡單地介紹了加Salt散列的工作方式(而非原理)、ASP.NET Membership中對其的實現。通過本文大家雖然無法對加Salt加密的有點和原理“知其所以然”,但相信大家應該大致了解了這種方式的使用方法,并能通過修改Membership的代碼實現自己的密碼散列存儲了。
由于時間有限,Anders Liu這篇文章寫得很潦草,羅列了不少代碼卻沒有系統性介紹,還望大家原諒。下一篇文章我將相對完整地介紹如何實現自己的用戶登錄(無需使用MembershipProvider,但同時也喪失了Login等控件為我們帶來的便利)。
【編輯推薦】