使用MD5加密數(shù)據(jù)庫中的用戶密碼(一)_Access數(shù)據(jù)庫教程
教程Tag:暫無Tag,歡迎添加,賺取U幣!
推薦:使用MD5加密數(shù)據(jù)庫中的用戶密碼(二)使用MD5鑒別是否合法用戶 既然用戶密碼是按照MD5加密以后保存在數(shù)據(jù)庫中的,我們知道,MD5是單次加密算法,所以,不可能將加密以后的信息轉(zhuǎn)為明文,也就是說,已經(jīng)沒有辦法知道。這就出現(xiàn)一個(gè)問題,如果用戶使用賬號(hào)、密碼登錄,怎么知道用戶提供的密碼是否
我們知道,現(xiàn)在網(wǎng)絡(luò)上一般的網(wǎng)站,稍微完善一點(diǎn)的,往往都需要用戶先注冊,提供諸如電子郵件、賬號(hào)、密碼等信息以后,成為網(wǎng)站欄目的注冊用戶,才可以享受網(wǎng)站一些特殊欄目提供的信息或者服務(wù),比如免費(fèi)電子郵件、論壇、聊天等,都需要用戶注冊。而對于電子商務(wù)網(wǎng)站,比如igo5等大型電子商務(wù)網(wǎng)站,用戶需要購買商品,就一定需要詳細(xì)而準(zhǔn)確的注冊,而這些信息,往往是用戶很隱秘的信息,比如電話、電子郵件、地址等,所以,注冊信息對于用戶和網(wǎng)站都是很重要的資源,不能隨意透露,更加不能存在安全上的隱患。如果我們也設(shè)計(jì)一個(gè)需要用戶注冊的網(wǎng)站,根據(jù)現(xiàn)在的常用技術(shù)實(shí)現(xiàn)方法,可以在數(shù)據(jù)庫中建立一個(gè)用于存放用戶信息的表,這個(gè)表中至少包括用戶賬號(hào)字段:UserAccount和用戶密碼字段:Password,當(dāng)然,實(shí)際應(yīng)用中一個(gè)用戶信息表不可能就只有這些信息,往往根據(jù)網(wǎng)站服務(wù)要求,會(huì)適當(dāng)增加一些其他的信息,以方便網(wǎng)站提供更加完善的服務(wù)。一般的,一個(gè)用戶信息占用這個(gè)用戶信息表的一行也就是一個(gè)數(shù)據(jù)記錄,當(dāng)用戶登錄或者提交資料的時(shí)候,程序?qū)⒂脩籼顚懙男畔⑴c表中的信息對照,如果用戶賬號(hào)和密碼都準(zhǔn)確無誤,那么說明這個(gè)用戶是合法用戶,通過注冊;反之,則是非法用戶,不許通過。
然而,是不是這樣就安全了了?是不是這樣就能滿足網(wǎng)站的注冊要求了呢?仔細(xì)想想,我們一般將用戶資料直接保存在數(shù)據(jù)庫中,并沒有進(jìn)行任何的保密措施,對于一些文件型數(shù)據(jù)庫比如Access等,如果有人得到這個(gè)文件,豈不是所有的資料都泄露無疑?更加重要的是,如果一個(gè)不負(fù)責(zé)任的網(wǎng)管,不需要任何技術(shù)手段,就可以查看網(wǎng)站中的任何資料,如果我們的用戶信息在數(shù)據(jù)庫中沒有加密,對于網(wǎng)管而言,查看這些信息是太簡單了。所以,為了增加安全性,我們有必要對數(shù)據(jù)庫中的資料進(jìn)行加密,這樣,即使有人得到了整個(gè)數(shù)據(jù)庫,如果沒有解密算法,也一樣不能查看到數(shù)據(jù)庫中的用戶信息。但是,在考慮數(shù)據(jù)庫是否安全之前,我們有必要對我們的數(shù)據(jù)是否真的那么重要進(jìn)行考慮,如果數(shù)據(jù)只是簡單的一些文件資料,沒有保密的必要,顯然,沒有必要對這些數(shù)據(jù)進(jìn)行加密而浪費(fèi)系統(tǒng)資源、加重程序負(fù)擔(dān),如果這些數(shù)據(jù)具有一定的隱私性,當(dāng)然就有必要進(jìn)行加密。所以,在考慮加密以前,我們可以對需要加密的數(shù)據(jù)做適當(dāng)?shù)倪x擇,以免浪費(fèi)系統(tǒng)資源。
MD5加密算法簡單介紹
在現(xiàn)階段,我們一般認(rèn)為存在兩種加密方式,單向加密和雙向加密。雙向加密是加密算法中最常用的,它將我們可以直接理解的明文數(shù)據(jù)加密為我們不可直接理解的密文數(shù)據(jù),然后,在需要的時(shí)候,可以使用一定的算法將這些加密以后的密文解密為原來可以理解的明文。雙向加密適合于隱秘通訊,比如,我們在網(wǎng)上購物的時(shí)候,需要向網(wǎng)站提交信用卡密碼,我們當(dāng)然不希望我們的數(shù)據(jù)直接在網(wǎng)上明文傳送,因?yàn)檫@樣很可能被別的用戶“偷聽”,我們希望我們的信用卡密碼是通過加密以后,再在網(wǎng)絡(luò)傳送,這樣,網(wǎng)站接受到我們的數(shù)據(jù)以后,通過解密算法就可以得到準(zhǔn)確的信用卡賬號(hào)。
單向加密剛好相反,只能對數(shù)據(jù)進(jìn)行加密,也就是說,沒有辦法對加密以后的數(shù)據(jù)進(jìn)行解密。可能我們立即就會(huì)想,這樣的加密有什么用處?不能解密的加密算法有什么作用呢?在實(shí)際中的一個(gè)應(yīng)用就是數(shù)據(jù)庫中的用戶信息加密,當(dāng)用戶創(chuàng)建一個(gè)新的賬號(hào)或者密碼,他的信息不是直接保存到數(shù)據(jù)庫,而是經(jīng)過一次加密以后再保存,這樣,即使這些信息被泄露,也不能立即理解這些信息的真正含義。
MD5就是采用單向加密的加密算法,對于MD5而言,有兩個(gè)特性是很重要的,第一是任意兩段明文數(shù)據(jù),加密以后的密文不能是相同的;第二是任意一段明文數(shù)據(jù),經(jīng)過加密以后,其結(jié)果必須永遠(yuǎn)是不變的。前者的意思是不可能有任意兩段明文加密以后得到相同的密文,后者的意思是如果我們加密特定的數(shù)據(jù),得到的密文一定是相同的。
MD5CyptoServiceProvider類是.NET中System.Security.Cryptography名字空間的一個(gè)類,提供專門用于MD5單向數(shù)據(jù)加密的解決方法,也是本文中我們用來加密數(shù)據(jù)庫中密碼的類。在真正進(jìn)行數(shù)據(jù)加密之前,我們首先來了解MD5CyptoServiceProvider類中的主要方法:ComputeHash,它將輸入的明文數(shù)據(jù)數(shù)組使用MD5加密以后輸出加密后的密文數(shù)據(jù)數(shù)組。現(xiàn)在,我們就來看一個(gè)具體的實(shí)例:
'要加密的明文字符串
Dim strPlainText as String = "Encrypt me!"
'用于存放明文字符串的數(shù)組
Dim hashedDataBytes as Byte()
Dim encoder as New UTF8Encoding()
'建立MD5CryptoService實(shí)例
Dim md5Hasher as New MD5CryptoServiceProvider()
'加密運(yùn)算
hashedDataBytes = md5Hasher.ComputeHash(encoder.GetBytes(strPlainText))
看完以上的具體實(shí)例以后,我們知道,ComputeHash方法只能接受數(shù)組作為加密對象,輸出的密文也是數(shù)組,因此,在對字符串加密之前,我們必須首先將這些字符串轉(zhuǎn)化為數(shù)組,這就要用到UTF8Encoding類的GetBytes方法,將字符串轉(zhuǎn)化為數(shù)組,而加密以后的結(jié)果也是使用數(shù)組輸出。
以上我們大致了解了MD5的具體加密實(shí)現(xiàn)方法,下面,我們結(jié)合數(shù)據(jù)庫來看看MD5的實(shí)際使用。
使用MD5存儲(chǔ)密碼
在前面的介紹中,我們提到網(wǎng)站往往將用戶的賬號(hào)、密碼等信息使用非加密的方式保存到數(shù)據(jù)庫,比如賬號(hào)使用類型為VarChar的UserCount字段,同樣,密碼也是采用類型為VarChar的Password字段。但是,如果我們打算采用MD5加密方式存儲(chǔ)密碼信息,就必須改變密碼字段PassWord的類型為16為二進(jìn)制方式,這個(gè)其實(shí)我們也不難理解,因?yàn)樵谇懊娴慕榻B中,我們知道加密以后的輸出,是使用二進(jìn)制數(shù)組的,所以,這里必須做相應(yīng)的改變。
當(dāng)用戶注冊成功,正式建立一個(gè)賬號(hào)的時(shí)候,數(shù)據(jù)庫中就必須為這個(gè)用戶增加一條記錄。以下的程序代碼實(shí)現(xiàn)了建立一個(gè)賬號(hào)的功能,在頁面中,程序要求用戶輸入賬號(hào)、密碼等信息,然后,將這些信息作為賬號(hào)信息存入名為UserCount的數(shù)據(jù)表,在這個(gè)表中,用戶密碼是使用MD5加密保存的。下面就是實(shí)現(xiàn)以上頁面的具體代碼:
<%@ Import Namespace="System.Security.Cryptography" %>
<%@ Import Namespace="System.Text" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<Script runat="server" language="VB">
Sub CreateAccount(sender as Object, e as EventArgs)
'1. 建立數(shù)據(jù)庫連接
Const strConnString as String = "connection string"
Dim objConn as New SqlConnection(strConnString)
'2. 建立Command對象
Dim strSQL as String = _
"INSERT INTO UserAccount(Username,Password) " & _
"VALUES(@Username, @Password)"
Dim objCmd as New SqlCommand(strSQL, objConn)
'3. SQL參數(shù)
Dim paramUsername as SqlParameter
paramUsername= New SqlParameter("@Username", SqlDbType.VarChar, 25)
paramUsername.Value = txtUsername.Text
objCmd.Parameters.Add(paramUsername)
'加密用戶密碼
Dim md5Hasher as New MD5CryptoServiceProvider()
Dim hashedBytes as Byte()
Dim encoder as New UTF8Encoding()
hashedBytes=md5Hasher.ComputeHash(encoder.GetBytes(txtPwd.Text))
Dim paramPwd as SqlParameter
paramPwd = New SqlParameter("@Password", SqlDbType.Binary, 16)
paramPwd.Value = hashedBytes
objCmd.Parameters.Add(paramPwd)
'加入數(shù)據(jù)庫
objConn.Open()
objCmd.ExecuteNonQuery()
objConn.Close()
End Sub
</script>
<Form runat="server">
<h1>建立一個(gè)賬號(hào)</h1>
用戶名:<asp:TextBox runat="server" id="txtUsername" />
<br />密碼:
<asp:TextBox runat="server" id="txtPwd" TextMode="Password" />
<p><asp:Button runat="server" Text="建立用戶賬號(hào)" onClick="CreateAccount" /></p>
</form>
在以上程序?qū)崿F(xiàn)的頁面中,“用戶名”和“密碼”輸入框要求用戶輸入自己的賬號(hào)和密碼,用戶輸入自己的信息以后,按“建立用戶賬號(hào)”按鈕,就可以建立一個(gè)賬號(hào)并且存入數(shù)據(jù)庫。我們同時(shí)需要特別注意,因?yàn)橐陨系某绦蚴褂玫搅薓D5加密和數(shù)據(jù)庫等功能,所以,在代碼最開頭,我們引入了幾個(gè)稍微特別一點(diǎn)的名字空間,這是不可缺少的。
我們可以看到,PassWord字段的信息是二進(jìn)制方式保存的,即使數(shù)據(jù)庫被人取得,也不可能知道密碼具體是什么意思。當(dāng)然,密碼也就不會(huì)泄露。
分享:解讀八種方法防止數(shù)據(jù)庫被下載下面提供的的方法分別適用使用虛擬主機(jī)空間的用戶和有IIS控制權(quán)的用戶! 一:購買虛擬主機(jī)空間的,適合沒有IIS控制權(quán) 1:發(fā)揮你的想象力 修改數(shù)據(jù)庫文件名 這個(gè)是最基本的。我想現(xiàn)在也沒有多少連數(shù)據(jù)庫文件名都懶得改的人吧? 至于改成什么,你自己看著辦,至
相關(guān)Access數(shù)據(jù)庫教程:
- Access數(shù)據(jù)庫安全策略之ASP式
- 第N次被ACCESS的關(guān)鍵字涮
- Access中用Jet SQL語句刪除表關(guān)系
- Access報(bào)表打印如何自動(dòng)分頁
- Access完成累計(jì)余額的計(jì)算
- 搭建Access為主的Mdb數(shù)據(jù)庫
- 一句sql更新兩個(gè)表并可更新對應(yīng)的字段值具體實(shí)現(xiàn)
- MySQL查詢優(yōu)化:連接查詢排序limit(join、order by、limit語句)介紹
- 內(nèi)網(wǎng)ssh/mysql登錄緩慢的解決方法
- 使用準(zhǔn)則進(jìn)行條件查詢--1.4.從窗體中選擇查詢的條件
- 中文Access2000速成教程--1.1 使用“向?qū)А痹O(shè)計(jì)數(shù)據(jù)庫
- 中文Access2000速成教程--1.3 在“設(shè)計(jì)”視圖中設(shè)計(jì)表
Access數(shù)據(jù)庫教程Rss訂閱編程教程搜索
Access數(shù)據(jù)庫教程推薦
猜你也喜歡看這些
- Access數(shù)據(jù)庫數(shù)據(jù)傳遞的方法
- 如何巧用SQL鏈接服務(wù)器訪問遠(yuǎn)程Access數(shù)據(jù)庫
- 獲取ACCESS2000數(shù)據(jù)庫中所有表的名稱
- 定期歸檔Access數(shù)據(jù)庫
- 用Access設(shè)計(jì)客觀試卷(3)
- 解讀八種方法防止數(shù)據(jù)庫被下載
- Access數(shù)據(jù)庫開發(fā)技巧(三)
- 給你的數(shù)據(jù)庫文件減肥
- 淺析在Access中模擬SqlServer存儲(chǔ)過程翻頁
- C# 連接Access數(shù)據(jù)時(shí)總報(bào)找不到dbo.mdb的問題
- 相關(guān)鏈接:
- 教程說明:
Access數(shù)據(jù)庫教程-使用MD5加密數(shù)據(jù)庫中的用戶密碼(一)
。