[英]How to authenticate user using column encryption of password as well as using password salt technique at business logic?
我在創建邏輯時遇到問題。 我有兩個存儲過程:一個通過加密密碼和電子郵件創建用戶帳戶:
if (SELECT count([Email])FROM [Regs] where EncryptByAsymKey(AsymKey_ID('---encryption key----'),@email)=@email)=0
begin
INSERT INTO [Regs]
([Password]
,[Email]) values (EncryptByAsymKey(AsymKey_ID('---encryption key----'),@password),EncryptByAsymKey(AsymKey_ID('---encryption key----'),@email));
select @scopeIdentity = SCOPE_IDENTITY();
--OTHER OPERATIONS--
其他人則通過接受密碼和電子郵件,然后將兩者解密來對用戶進行身份驗證:
if @keyType=0 and (select count([UsrId]) FROM [Regs] where CONVERT(nvarchar(MAX), DECRYPTBYASYMKEY(ASYMKEY_ID('---encryption key----'), [Password], @enkey)) = @password and CONVERT(nvarchar(MAX), DECRYPTBYASYMKEY(ASYMKEY_ID('---encryption key----'), [Email], @enkey))= @key)>0
begin
select @userId= [UsrId],@username=[UserName],@uemail=CONVERT(nvarchar(MAX), DECRYPTBYASYMKEY(ASYMKEY_ID('---encryption key----'), [Email], @enkey)) FROM [Regs] where CONVERT(nvarchar(MAX), DECRYPTBYASYMKEY(ASYMKEY_ID('---encryption key----'), [Password], @enkey))=@password and CONVERT(nvarchar(MAX), DECRYPTBYASYMKEY(ASYMKEY_ID('---encryption key----'), [Email], @enkey))=@key;
set @isvalidated=0;
set @o_uid=@userid;
set @o_username=@username;
set @o_uemail=@uemail
end
--OTHER OPERATIONS--
--OTHER OPERATIONS--
包含諸如在創建或驗證用戶時插入,刪除或更新其他表之類的任務。 這就是我面臨的問題。
這兩個存儲過程由C#函數createUser()
和authUser()
。 我希望每個功能只能建立一個數據庫連接。 這就是為什么我在同一存儲過程中編寫其他操作的原因。 這樣就可以一次往返數據庫。 這會將調用保存到數據庫。
現在,我要實現此處給出的密碼哈希或鹽技術: http : //www.codeproject.com/Articles/425150/Beginners-guide-to-a-secure-way-of-storing-passwor 。
本文介紹了如何在C#中對密碼進行哈希處理並將其發送到數據庫,然后進行獲取,再次對其進行哈希處理,然后在C#處進行比較。 但是問題是我的比較是在存儲過程中完成的,如果正確,則存儲過程將執行其他操作。 但是我也想在C#處散列密碼,以便即使破解了數據庫加密,黑客也將需要C#代碼來找出真實的密碼(反之亦然)。 因此,請告訴我如何在不對存儲過程進行任何更改的情況下實現此技術?
在99.999999999%的情況下,您需要哈希密碼,以便無法檢索原始密碼。 這意味着即使您的數據庫遭到破壞,也需要大量的計算工作才能檢索密碼。
如果您對將其留在SQL Server上HASHBYTES
,那么我將不使用AES, HASHBYTES
來看看HASHBYTES
。 使用SHA2_256
或SHA2_512
作為算法,並對輸入進行加鹽處理,就像您已經在做的那樣。 但是,還有其他更安全的哈希函數(如bcrypt或PBKDF2),我認為這些函數不是在SQL中實現的,因此您需要在業務邏輯層實現密碼哈希。
一旦實現了哈希方法,就可以按照生成用戶密碼哈希的相同方式來哈希用戶輸入。 然后將散列的輸入值與數據庫中存儲的散列進行比較。 如果它們匹配,則密碼匹配。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.