文章目錄
VB、C#中SALT+SHA512密碼驗證
當鹽值(salt)是以Base64格式存儲的,而你需要將其用於生成SHA-512哈希時,首先你需要將Base64編碼的鹽值轉換回其原始的字節數組形式。然後,將這個字節數組與用戶的密碼(已轉換為字節數組)結合在一起,最後對結合後的字節數組進行哈希處理。
判斷使用哈希+鹽值加密的密碼是否正確
- 從資料庫中獲取用戶的鹽值和存儲的哈希值。
- 將提交的密碼與從資料庫中獲取的鹽值結合。
- 使用相同的哈希算法對結合後的密碼進行哈希處理。
- 比較新生成的哈希值與資料庫中存儲的哈希值。如果它們相等,則密碼正確;否則,密碼錯誤。
生成SALT,格式:Base64
生成HASH,演算法:SHA512
首先需將Base64編碼的鹽值轉換為字節數組(Byte)
C# 版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
using System; using System.Security.Cryptography; using System.Text; public class PasswordHasher { public static string GenerateSHA512Hash(string input, string base64Salt) { // 將Base64編碼的鹽值轉換回字節數組 byte[] saltBytes = Convert.FromBase64String(base64Salt); // 將密碼轉換為字節數組 byte[] inputBytes = Encoding.UTF8.GetBytes(input); // 結合密碼字節數組和鹽值字節數組 byte[] combinedBytes = new byte[inputBytes.Length + saltBytes.Length]; Buffer.BlockCopy(inputBytes, 0, combinedBytes, 0, inputBytes.Length); Buffer.BlockCopy(saltBytes, 0, combinedBytes, inputBytes.Length, saltBytes.Length); using (SHA512 sha512 = SHA512.Create()) { // 對結合後的字節數組進行哈希處理 byte[] hashBytes = sha512.ComputeHash(combinedBytes); // 將哈希值轉換為16進制字符串 // For .NET 5 and above, otherwise use BitConverter.ToString(hashBytes).Replace("-", "").ToLower(); return Convert.ToHexString(hashBytes); } } } |
VB.NET 版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Imports System Imports System.Security.Cryptography Imports System.Text Public Class PasswordHasher Public Shared Function GenerateSHA512Hash(input As String, base64Salt As String) As String ' 將Base64編碼的鹽值轉換回字節數組 Dim saltBytes() As Byte = Convert.FromBase64String(base64Salt) ' 將密碼轉換為字節數組 Dim inputBytes() As Byte = Encoding.UTF8.GetBytes(input) ' 結合密碼字節數組和鹽值字節數組 Dim combinedBytes(inputBytes.Length + saltBytes.Length - 1) As Byte Buffer.BlockCopy(inputBytes, 0, combinedBytes, 0, inputBytes.Length) Buffer.BlockCopy(saltBytes, 0, combinedBytes, inputBytes.Length, saltBytes.Length) Using sha512 As SHA512 = SHA512.Create() ' 對結合後的字節數組進行哈希處理 Dim hashBytes() As Byte = sha512.ComputeHash(combinedBytes) ' 將哈希值轉換為16進制字符串 Return BitConverter.ToString(hashBytes).Replace("-", "").ToLower() ' 或者使用其他方式轉換為16進制字符串 End Using End Function End Class |
在這個方法中,base64Salt是Base64編碼的鹽值字符串。首先,我們使用Convert.FromBase64String(base64Salt)將其轉換成原始的字節數組形式。接著,我們創建一個新的字節數組combinedBytes來存放密碼字節數組和鹽值字節數組的結合。使用Buffer.BlockCopy方法將這兩個字節數組複製到combinedBytes中。最後,對這個結合後的字節數組進行SHA-512哈希處理,並將結果轉換為16進制字符串返回。
這樣處理後,即使鹽值是以Base64格式提供的,也能正確地結合鹽值和密碼進行哈希,從而保證了哈希過程的安全性和一致性。