2010-03-03 24 views
2

不幸的是,我在數據庫中有明文密碼。我想盡可能少地傳遞這些明文值,比如說比較和更新。爲此,我試圖創建排除明文密碼的Users表的視圖,而是提供該密碼的哈希值。我可以連接視圖中的虛擬列嗎?

這裏是我當前的SQL Server視圖,它不起作用:

SELECT CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt 
     HashBytes('SHA1', PasswordSalt + u.Password) AS PasswordHash 
FROM dbo.Users AS u 

我很樂意聽到的替代品,以這種方法,但在其他問題似乎串聯虛擬列PasswordSalt與..任何東西。舉例來說,下面這個簡單的視圖的工作原理:

SELECT u.Login AS Column1, u.Login + 'b' AS Column2 

但是這一次沒有:

SELECT u.Login AS Column1, Column1 + 'b' AS Column2 

我從Management Studio中收到錯誤

無效的列名稱列1 」。

在此先感謝有關我做錯事情的任何想法!

+0

你可以只加密列(SQL服務器2005 +):http://msdn.microsoft.com/en-us/library/ms179331% 28SQL.90%29.aspx – 2010-03-03 22:57:01

+0

只有我能夠重現錯誤的方法是因爲column1不存在 – 2010-03-03 22:58:38

+0

我選擇了一個散列來確保消費者可以重現該轉換,但不能恢復u.Password。我相信排除加密。 – ladenedge 2010-03-04 06:14:05

回答

1

由於語句的FROM子句指示要選擇的數據來自Users表,但SELECT部分​​引用了一個名爲PasswordSalt的列,因此會出現問題。 SQL Server無法在Users表中找到具有此名稱的列,因此出現此錯誤。

另一種方法可能是在子查詢中生成Salt。例如

SELECT x.PasswordSalt,  HashBytes('SHA1', x.PasswordSalt + x.Password) AS PasswordHash FROM (SELECT  CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt, Password FROM dbo.Users) x

+0

這個伎倆!感謝您的優雅解決方案! – ladenedge 2010-03-04 06:26:17

1

什麼

SELECT CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt 
     HashBytes('SHA1', CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) + u.Password) AS PasswordHash 
FROM dbo.Users AS u 
+0

這一個似乎有問題,因爲我需要確保* PasswordSalt *虛擬列包含與密碼哈希值相同的值。如果他們有所不同,消費者將無法驗證密碼匹配。 – ladenedge 2010-03-04 06:10:59

+0

我相信無論你調用Rand()多少次,它都會爲集合中的每一行返回相同的值 – unclepaul84 2010-03-04 15:38:41

相關問題