2012-02-12 65 views
5

我正在嘗試使用登錄/註銷功能創建網站,並計劃正確散列和醃製密碼。然而,我面臨的問題是我如何將密碼存儲在數據庫中。我知道我需要在數據庫中存儲散列+密碼(不是純文本或純文本加密),但我不知道如何在技術上將二進制數據插入到數據庫中。如何將散列存儲在使用C#的SQL Server數據庫中?

在我的早期嘗試中,我可以在數據庫中獲取數據的唯一方法是將二進制數據轉換爲base64字符串並插入到varchar密碼字段中,但有些事情告訴我這不是正確的方法去做吧。

數據庫中的密碼字段當前是varchar,但據我所知,哈希密碼是二進制的。所以即使我將密碼字段改爲二進制對象,我仍然不知道如何實際插入它!

如果我沒有任何意義,請要求澄清,我會盡快與您聯繫。

+1

散列可以是一個varchar ...它不必是二進制的,但出於好奇心你使用的has函數是什麼? – hackartist 2012-02-12 21:25:33

+1

爲什麼你不想使用base64?這很簡單,數據足夠小,不用擔心大小。 – 2012-02-12 21:31:32

+0

Base64是最安全的方式,它將散列以可讀的形式存在。將醃製散列存儲爲純文本沒有任何問題;這就是存儲散列而不是密碼的全部目的。 – Douglas 2012-02-12 21:34:37

回答

3

不,散列密碼不必存儲在varbinary字段中,您可以對其進行編碼並將其存儲在varchar字段中。對於編碼任何類型的字符,Base64是一個很好的選擇。

+2

你使用什麼樣的散列生成字符串而不是序列的叮咬?所有加密函數都具有我知道的函數將生成128,160,256或512位等一定數量的位,並且不是字符串(字符串使用編碼存儲)。 – 2012-02-12 21:51:09

+0

@MartinLiversage我已經使用MD5哈希來存儲密碼在varchar字段不存在問題。 Linux在/ etc /密碼中使用了MD5哈希來保存時間。關鍵是你不必將它們存儲在varbinary字段中。 – Icarus 2012-02-12 22:55:13

+1

當然,你可以在'varchar'列中存儲散列,但是你需要使用類似base64編碼的東西對它們進行編碼。你的答案似乎表明,散列可以直接存儲,而不必考慮在字符串中沒有意義的隨機二進制序列。 – 2012-02-13 06:16:05

6

在Microsoft SQL Server中,您可以將二進制數據存儲在具有binary數據類型的列(如果需要可變長度數據,則爲varbinary)。你可以使用它來處理散列和密碼。如果你使用512位散列函數並且想要使用512位的salt,你需要2 * 512/8 = 128個字節(例如binary(128)來存儲鹽和散列表。)

通常情況下,無論你用什麼API來讀寫數據庫應該幫助您在讀取和寫入二進制數據。但是,也許你想使用一些SQL直接插入一個二進制值到表中可以使用的語法如下:。

insert into MyTable values (0x123456789ABCDEF) 

不是一個真正的回答你的問題,但如果您在實施自己的密碼功能時遇到困難,則可以考慮使用預構建的工業強度組件,以避免將來出現尷尬錯誤。例如,ASP.NET has a membership provider

相關問題