使用MD5加密資料庫中的使用者密碼介紹

2021-12-29 19:52:55 字數 3509 閱讀 1698

●前言

我們知道,現在網路上一般的**,稍微完善一點的,往往都需要使用者先註冊,提供諸如電子郵件、賬號、密碼等資訊以後,成為**欄目的註冊使用者,才可以享受**一些特殊欄目提供的資訊或者服務,比如免費電子郵件、論壇、聊天等,都需要使用者註冊。而對於電子商務**,比如igo5等大型電子商務**,使用者需要購買商品,就一定需要詳細而準確的註冊,而這些資訊,往往是使用者很隱秘的資訊,比如**、電子郵件、位址等,所以,註冊資訊對於使用者和**都是很重要的資源,不能隨意透露,更加不能存在安全上的隱患。

如果我們也設計乙個需要使用者註冊的**,根據現在的常用技術實現方法,可以在資料庫中建立乙個用於存放使用者資訊的表,這個表中至少包括使用者賬號字段:useraccount和使用者密碼字段:password,當然,實際應用中乙個使用者資訊表不可能就只有這些資訊,往往根據**服務要求,會適當增加一些其他的資訊,以方便**提供更加完善的服務。一般的,乙個使用者資訊占用這個使用者資訊表的一行也就是乙個資料記錄,當使用者登入或者提交資料的時候,程式將使用者填寫的資訊與表中的資訊對照,如果使用者賬號和密碼都準確無誤,那麼說明這個使用者是合法使用者,通過註冊;反之,則是非法使用者,不許通過。

然而,是不是這樣就安全了了?是不是這樣就能滿足**的註冊要求了呢?仔細想想,我們一般將使用者資料直接儲存在資料庫中,並沒有進行任何的保密措施,對於一些檔案型資料庫比如access等,如果有人得到這個檔案,豈不是所有的資料都洩露無疑?更加重要的是,如果乙個不負責任的網管,不需要任何技術手段,就可以檢視**中的任何資料,如果我們的使用者資訊在資料庫中沒有加密,對於網管而言,檢視這些資訊是太簡單了。所以,為了增加安全性,我們有必要對資料庫中的資料進行加密,這樣,即使有人得到了整個資料庫,如果沒有解密演算法,也一樣不能檢視到資料庫中的使用者資訊。但是,在考慮資料庫是否安全之前,我們有必要對我們的資料是否真的那麼重要進行考慮,如果資料只是簡單的一些檔案資料,沒有保密的必要,顯然,沒有必要對這些資料進行加密而浪費系統資源、加重程式負擔,如果這些資料具有一定的私隱性,當然就有必要進行加密。所以,在考慮加密以前,我們可以對需要加密的資料做適當的選擇,以免浪費系統資源。

●md5加密演算法簡單介紹

在現階段,我們一般認為存在兩種加密方式,單向加密和雙向加密。雙向加密是加密演算法中最常用的,它將我們可以直接理解的明文資料加密為我們不可直接理解的密文資料,然後,在需要的時候,可以使用一定的演算法將這些加密以後的密文解密為原來可以理解的明文。雙向加密適合於隱秘通訊,比如,我們在網上購物的時候,需要向**提交信用卡密碼,我們當然不希望我們的資料直接在網上明文傳送,因為這樣很可能被別的使用者「偷聽」,我們希望我們的信用卡密碼是通過加密以後,再在網路傳送,這樣,**接受到我們的資料以後,通過解密演算法就可以得到準確的信用卡賬號。

單向加密剛好相反,只能對資料進行加密,也就是說,沒有辦法對加密以後的資料進行解密。可能我們立即就會想,這樣的加密有什麼用處?不能解密的加密演算法有什麼作用呢?在實際中的乙個應用就是資料庫中的使用者資訊加密,當使用者建立乙個新的賬號或者密碼,他的資訊不是直接儲存到資料庫,而是經過一次加密以後再儲存,這樣,即使這些資訊被洩露,也不能立即理解這些資訊的真正含義。

md5就是採用單向加密的加密演算法,對於md5而言,有兩個特性是很重要的,第一是任意兩段明文資料,加密以後的密文不能是相同的;第二是任意一段明文資料,經過加密以後,其結果必須永遠是不變的。前者的意思是不可能有任意兩段明文加密以後得到相同的密文,後者的意思是如果我們加密特定的資料,得到的密文一定是相同的。

md5cyptoserviceprovider類是.net中system.security.cryptography名字空間的乙個類,提供專門用於md5單向資料加密的解決方法,也是本文中我們用來加密資料庫中密碼的類。在真正進行資料加密之前,我們首先來了解md5cyptoserviceprovider類中的主要方法:computehash,它將輸入的明文資料陣列使用md5加密以後輸出加密後的密文資料陣列。現在,我們就來看乙個具體的例項:

『要加密的明文本串

dim strplaintext as string = "encrypt me!"

'用於存放明文本串的陣列

dim hasheddatabytes as byte()

dim encoder as new utf8encoding()

'建立md5cryptoservice例項

dim md5hasher as new md5cryptoserviceprovider()

'加密運算

hasheddatabytes = md5hasher.computehash(encoder.getbytes(strplaintext))看完以上的具體例項以後,我們知道,computehash方法只能接受陣列作為加密物件,輸出的密文也是陣列,因此,在對字串加密之前,我們必須首先將這些字串轉化為陣列,這就要用到utf8encoding類的getbytes方法,將字串轉化為陣列,而加密以後的結果也是使用陣列輸出。

以上我們大致了解了md5的具體加密實現方法,下面,我們結合資料庫來看看md5的實際使用。

●使用md5儲存密碼

在前面的介紹中,我們提到**往往將使用者的賬號、密碼等資訊使用非加密的方式儲存到資料庫,比如賬號使用型別為varchar的usercount欄位,同樣,密碼也是採用型別為varchar的password欄位。但是,如果我們打算採用md5加密方式儲存密碼資訊,就必須改變密碼欄位password的型別為16為二進位制方式,這個其實我們也不難理解,因為在前面的介紹中,我們知道加密以後的輸出,是使用二進位制陣列的,所以,這裡必須做相應的改變。

當使用者註冊成功,正式建立乙個賬號的時候,資料庫中就必須為這個使用者增加一條記錄。以下的程式**實現了建立乙個賬號的功能,在頁面中,程式要求使用者輸入賬號、密碼等資訊,然後,將這些資訊作為賬號資訊存入名為usercount的資料表,在這個表中,使用者密碼是使用md5加密儲存的。下面就是實現以上頁面的具體**:

在以上程式實現的頁面中,「使用者名稱」和「密碼」輸入框要求使用者輸入自己的賬號和密碼,使用者輸入自己的資訊以後,按「建立使用者賬號」按鈕,就可以建立乙個賬號並且存入資料庫。我們同時需要特別注意,因為以上的程式使用到了md5加密和資料庫等功能,所以,在**最開頭,我們引入了幾個稍微特別一點的名字空間,這是不可缺少的。我們可以看到,password欄位的資訊是二進位制方式儲存的,即使資料庫被人取得,也不可能知道密碼具體是什麼意思。當然,密碼也就不會洩露。

●使用md5鑑別是否合法使用者

既然使用者密碼是按照md5加密以後儲存在資料庫中的,我們知道,md5是單次加密演算法,所以,不可能將加密以後的資訊轉為明文,也就是說,已經沒有辦法知道。這就出現乙個問題,如果使用者使用賬號、密碼登入,怎麼知道使用者提供的密碼是否準確呢?

這就不得不提到我們前文說到的md5的特徵,我們知道,任意一段明文資料,經過加密以後,其結果必須永遠是不變的,也就是說,如果需要驗證使用者密碼是否正確,只需要將使用者當前提供的密碼使用md5加密,然後和資料庫中儲存的密碼字段比較就可以了。以下**就可以實現這個功能:

●使用加密方式儲存密碼到資料庫的限制在決定是否使用加密方式儲存密碼以前,我們還需要考慮一些問題。因為md5是單次加密演算法,加密以後的資訊不可以解密,所以,如果使用者丟失密碼,任何人都很難找到使用者原來的密碼,這時候,**也就相應的失去乙個很重要的功能,那就是使用者提供其他資訊來取得忘記的密碼的功能,這不能不說是**的乙個大缺陷。另外,採用這樣的加密方式,必須完全修改以前的使用者資料,要求使用者完全重新註冊,這也是這種方法比較困難的乙個地方。

用 MD5 加密資料庫中的使用者密碼

在前面的介紹中,我們提到 往往將使用者的賬號 密碼等資訊使用非加密的方式儲存到資料庫,比如賬號使用型別為varchar的usercount欄位,同樣,密碼也是採用型別為varchar的password欄位。但是,如果我們打算採用md5加密方式儲存密碼資訊,就必須改變密碼欄位password的型別為1...

用 MD5 加密資料庫中的使用者密碼

現在網路上一般的 稍微完善一點的,往往都需要使用者先註冊,提供諸如電子郵件 賬號 密碼等資訊以後,成為 欄目的註冊使用者,才可以享受 一些特殊欄目提供的資訊或者服務,比如免費電子郵件 論壇 聊天等,都需要使用者註冊。而對於電子商務 比如igo5等大型電子商務 使用者需要購買商品,就一定需要詳細而準確...

資料庫MD5加密(擴充套件)

create table tes 5 id int 4 notnull name varchar 20 not null pwd varchar 50 not null primary key id engine innodb default charset utf8插入一些資料 insert in...