當前位置:編程學習大全網 - 編程語言 - Asp.net程序加密數據庫中的密碼。

Asp.net程序加密數據庫中的密碼。

●前言

我們知道,網上的壹般網站,稍微完善壹點的,往往都是要求用戶先註冊,提供郵箱、賬號、密碼等信息後成為網站欄目的註冊用戶,才能享受網站的壹些特色欄目提供的信息或服務,比如免費郵箱、論壇、聊天等。,這些都需要用戶註冊。對於電商網站來說,比如igo5等大型電商網站,如果用戶需要購買商品,必須進行詳細準確的註冊,而這些信息往往是用戶的秘密信息,比如電話號碼、郵箱、地址等。所以註冊信息對於用戶和網站來說都是非常重要的資源,不能隨意泄露,更不要說隱藏安全隱患。

如果我們也設計壹個需要用戶註冊的網站,可以按照目前常用的技術實現方式,在數據庫中建立壹個存儲用戶信息的表。該表至少包括用戶帳戶字段:用戶帳戶和用戶密碼字段:密碼。當然,用戶信息表在實際應用中不可能只有這些信息。往往會根據網站的服務需求,適當添加壹些其他信息,方便網站提供更完善的服務。壹般壹個用戶的信息占這個用戶信息表的壹行,也是壹個數據記錄。當用戶登錄或提交信息時,程序會將用戶填寫的信息與表中的信息進行比較。如果用戶的賬號和密碼準確,則說明該用戶是合法用戶。另壹方面是非法用戶,不允許通過。

但是,這樣安全嗎?這樣夠不夠滿足網站的註冊要求?仔細想想。壹般情況下,我們直接將用戶數據保存在數據庫中,沒有任何安全措施。對於Access等壹些基於文件的數據庫,如果有人得到了這個文件,豈不是所有的數據都泄露了?更重要的是,如果壹個不負責任的站長可以在沒有任何技術手段的情況下查看網站中的任何信息,如果我們的用戶信息沒有在數據庫中加密,那麽站長查看這些信息就太簡單了。所以為了增加安全性,我們有必要對數據庫中的數據進行加密,這樣即使有人拿到了整個數據庫,如果沒有解密算法,數據庫中的用戶信息也是無法查看的。但是,在考慮數據庫是否安全之前,我們有必要考慮我們的數據是否真的那麽重要。如果數據只是簡單的文檔,沒有必要保密,顯然,沒有必要對這些數據進行加密,既浪費了系統資源,又增加了程序的負擔。如果這些數據有壹定的私密性,當然要加密。因此,在考慮加密之前,我們可以對要加密的數據進行適當的選擇,以免浪費系統資源。

●MD5加密算法簡介

現階段,我們壹般認為有兩種加密方式,單向加密和雙向加密。雙向加密是最常用的加密算法。它把我們能直接理解的明文數據加密成我們不能直接理解的密文數據,然後在必要的時候,我們可以用某種算法把這些加密的密文解密成我們原本能理解的明文。雙向加密適用於秘密通信。例如,當我們在網上購物時,我們需要向網站提交我們的信用卡密碼。當然,我們不希望自己的數據直接在網上明文傳輸,因為很可能被其他用戶竊聽。我們希望我們的信用卡密碼被加密後在網絡上傳輸,這樣網站收到我們的數據後,通過解密算法就可以得到準確的信用卡賬號。

而單向加密只能對數據進行加密,也就是沒有辦法對加密的數據進行解密。也許我們會馬上想到,這樣的加密有什麽用?無法解密的加密算法的作用是什麽?壹個實際應用是數據庫中用戶信息的加密。當用戶創建新的賬號或密碼時,其信息並不是直接保存在數據庫中,而是經過壹次加密後保存,這樣即使信息泄露,也無法立即了解信息的真實含義。

MD5是壹種使用單向加密的加密算法。對於MD5,有兩個特征非常重要。第壹個是任意兩個明文數據加密後不能相同;第二是任何壹段明文數據,加密之後,結果壹定總是壹樣的。前者意味著任何兩塊明文加密後都不可能得到相同的密文,後者意味著如果我們加密特定的數據,密文壹定是相同的。

MD5CyptoServiceProvider類是System的壹個類。中的加密命名空間。NET,它為MD5單向數據加密提供了壹種特殊的解決方案,也是我們在本文中用來加密數據庫中密碼的類。在進行數據加密之前,我們先了解壹下MD5CyptoServiceProvider類中的主要方法:ComputeHash,用MD5對輸入的明文數據數組進行加密,輸出加密後的密文數據數組。現在,讓我們看壹個具體的例子:

;要加密的明文字符串。

dim strPlainText as String = " Encrypt me!"

;用於存儲明文字符串的數組。

Dim hashedDataBytes as Byte()

Dim編碼器作為新的utf8編碼()

;建立MD5CryptoService的實例。

Dim md5Hasher作為新的MD5CryptoServiceProvider()

;加密操作

hashedDataBytes = md5Hasher。ComputeHash(編碼器。GetBytes(strPlainText))

看了上面的具體例子,我們知道ComputeHash方法只能接受數組作為加密對象,輸出的密文也是數組。所以在加密字符串之前,首先要把這些字符串轉換成數組,這就需要UTF8Encoding類的GetBytes方法把字符串轉換成數組,加密的結果也是由數組輸出的。

以上,我們大致了解了MD5的具體加密實現方法。下面,我們就來看看MD5結合數據庫的實際使用情況。

●使用MD5存儲密碼。

我們在前面的介紹中提到,網站往往會將用戶的賬號、密碼等信息以不加密的方式保存到數據庫中,比如以VarChar為賬號的UserCount字段,以VarChar為密碼的Password字段。但是如果打算使用MD5加密來存儲密碼信息,就必須將密碼字段的類型改為16為二進制,這壹點我們其實不難理解,因為在前面的介紹中,我們知道加密輸出使用的是二進制數組,所以這裏必須做相應的修改。

當用戶成功註冊並正式建立帳戶時,必須為該用戶向數據庫添加壹條記錄。下面的程序代碼實現了建立賬戶的功能。在頁面中,程序要求用戶輸入賬號、密碼等信息,然後將這些信息作為賬戶信息存儲在壹個名為UserCount的數據表中。在該表中,用戶密碼通過MD5加密和保存。以下是實現上述頁面的具體代碼:

& lt%@ Import Namespace="System。安全性。密碼術" % >;

& lt%@ Import Namespace="System。文本" % >;

& lt%@ Import Namespace="System。數據" % >;

& lt%@ Import Namespace="System。Data . SqlClient " % & gt

& lt腳本runat = " server " language = " VB " & gt;

Sub CreateAccount(發件人作為對象,e作為EventArgs)

;1.建立數據庫連接

Const strConnString as String = "連接字符串"

Dim objConn作為新的SqlConnection(strConnString)

;2.創建命令對象

Dim strSQL as String = _

"插入到用戶帳戶(用戶名,密碼)" & amp_

值(@用戶名,@密碼)

Dim objCmd作為新的SqlCommand(strSQL,objConn)

;3.SQL參數

Dim paramUsername作為SqlParameter

param Username = New SQL parameter(" @ Username ",SqlDbType)。VarChar,25歲)

param用戶名。值= txtUsername。文本

objCmd。參數. Add(paramUsername)

;加密的用戶密碼

Dim md5Hasher作為新的MD5CryptoServiceProvider()

Dim hashedBytes as Byte()

Dim編碼器作為新的utf8編碼()

hashedBytes=md5Hasher。ComputeHash(編碼器。GetBytes(txtPwd。正文))

Dim paramPwd作為SqlParameter

param pwd = New SQL parameter(" @ Password ",SqlDbType。二進制,16)

paramPwd。值=哈希字節

objCmd。Parameters.Add(paramPwd)

;加入數據庫

objConn。打開()

objCmd。ExecuteNonQuery()

objConn。關閉()

末端接頭

& lt/script & gt;

& ltform runat = " server " & gt

& lth 1 & gt;建立賬戶

用戶名:

密碼:

& ltASP:TextBox runat = " server " id = " txt pwd " text mode = " Password "/& gt;

& ltp & gt& ltAsp:Button runat="server" Text= "創建用戶帳戶"

OnClick = " create account "/& gt;& lt/p & gt;

& lt/form & gt;

在上述程序實現的頁面中,“用戶名”和“密碼”輸入框要求用戶輸入自己的賬號和密碼。在用戶輸入自己的信息後,他可以按“創建用戶帳戶”按鈕來創建壹個帳號並將其存儲在數據庫中。同時需要特別註意的是,因為上面的程序使用了MD5加密和數據庫函數,所以在代碼的開頭,我們引入了幾個稍微特殊的命名空間,這是必不可少的。

我們可以看到,密碼字段中的信息是以二進制存儲的,即使獲取了數據庫,也無法知道密碼的具體含義。當然,密碼是不會泄露的。

●使用MD5識別合法用戶。

由於用戶密碼是按照MD5加密後存儲在數據庫中的,我們知道MD5是壹次性加密算法,所以不可能把加密的信息轉換成明文,也就是沒有辦法知道。這就提出了壹個問題。如果用戶用賬號和密碼登錄,怎麽知道用戶提供的密碼是否準確?

這就不得不提上面提到的MD5的特性了。我們知道,任何壹段明文數據加密後,結果壹定總是壹樣的。也就是說,如果需要驗證用戶的密碼是否正確,只需要將用戶提供的密碼用MD5加密,然後與數據庫中保存的密碼字段進行比對。下面的代碼可以實現這個功能:

& lt%@ Import Namespace="System。安全性。密碼術" % >;

& lt%@ Import Namespace="System。文本" % >;

& lt%@ Import Namespace="System。數據" % >;

& lt%@ Import Namespace="System。Data . SqlClient " % & gt

& lt腳本runat = " server " language = " VB " & gt;

子登錄(發件人作為對象,例如EventArgs)

;1.建立數據庫連接

Const strConnString as String = "連接字符串"

Dim objConn作為新的SqlConnection(strConnString)

;2.創建命令對象

dim strSQL as String = " SELECT COUNT(*)FROM user account " & amp;_

"其中用戶名= @用戶名和密碼= @密碼"

Dim objCmd作為新的SqlCommand(strSQL,objConn)

;3.SQL參數

Dim paramUsername作為SqlParameter

param Username = New SQL parameter(" @ Username ",SqlDbType)。VarChar,25歲)

param用戶名。值= txtUsername。文本

objCmd。參數. Add(paramUsername)

;加密密碼信息

Dim md5Hasher作為新的MD5CryptoServiceProvider()

Dim hashedDataBytes as Byte()

Dim編碼器作為新的utf8編碼()

hashedDataBytes = md5Hasher。ComputeHash(編碼器。GetBytes(txtPwd。正文))

Dim paramPwd作為SqlParameter

param pwd = New SQL parameter(" @ Password ",SqlDbType。二進制,16)

paramPwd。值=哈希數據字節

objCmd。Parameters.Add(paramPwd)

objConn。打開()

Dim iResults as Integer = objCmd。ExecuteScalar()

objConn。關閉()

如果iResults = 1,則

;正確的

其他

;錯誤

如果…就會結束

末端接頭

& lt/script & gt;

& ltform runat = " server " & gt

& lth 1 & gt;登錄& lt/h 1 & gt;

用戶賬號:

密碼:

& ltASP:TextBox runat = " server " id = " txt pwd " text mode = " Password "/& gt;

& ltp & gt& ltASP:Button Runat = " server " text = " log in " onclick = " log in "/& gt;

& lt/form & gt;

●通過加密將密碼保存到數據庫的限制。

在決定是否使用加密來保存密碼之前,我們仍然需要考慮壹些問題。因為MD5是壹次性加密算法,所以加密的信息無法解密。因此,如果用戶丟失了密碼,任何人都很難找到用戶的原始密碼。這個時候網站就會相應的失去壹個很重要的功能,就是用戶可以提供其他信息來獲取忘記的密碼。這是網站的壹大缺陷。另外,使用這種加密方式,必須完全修改之前的用戶數據,要求用戶完全重新註冊,這也是這種方式的難點所在。

●總結

以上詳細介紹了MD5加密用戶密碼的實現方法,也介紹了采用加密密碼後用戶認證的實現。還討論了這種加密方法的應用限制。在實際應用中,我們可以適當修改和補充子方法,以更好地滿足我們的應用需求。

  • 上一篇:數控編程怎麽樣
  • 下一篇:大學生就業是否應該先就業後擇業?
  • copyright 2024編程學習大全網