如何逆向分析SHA512Managed哈希生成逻辑?适配现有用户密码库
排查商用工具哈希生成逻辑的可行方案
已知测试用户的明文密码、盐值和目标哈希,你可以通过以下步骤逐步验证并还原哈希生成逻辑:
1. 先确认核心编码与组合规则
首先排除最基础的编码和组合顺序问题:
- 编码验证:将明文密码和盐值分别用
UTF-8、UTF-16LE(.NET默认Unicode)、ASCII编码转为字节数组,尝试所有组合。 - 组合顺序:测试
密码字节+盐字节、盐字节+密码字节、密码字节+分隔符字节(如冒号、空字节)+盐字节这几种常见组合,生成SHA512哈希后转Base64(88位长度的哈希大概率是Base64编码的64字节SHA512结果),对比数据库中的值。
示例代码:
using System.Security.Cryptography; using System.Text; public static string GenerateHash(string password, string salt, Encoding encoding, bool passwordFirst = true) { byte[] passwordBytes = encoding.GetBytes(password); byte[] saltBytes = encoding.GetBytes(salt); byte[] combined = passwordFirst ? CombineBytes(passwordBytes, saltBytes) : CombineBytes(saltBytes, passwordBytes); using (var sha512 = SHA512.Create()) { byte[] hashBytes = sha512.ComputeHash(combined); return Convert.ToBase64String(hashBytes); } } private static byte[] CombineBytes(byte[] a, byte[] b) { byte[] result = new byte[a.Length + b.Length]; Buffer.BlockCopy(a, 0, result, 0, a.Length); Buffer.BlockCopy(b, 0, result, a.Length, b.Length); return result; }
2. 验证是否使用PBKDF2迭代哈希
很多商用工具不会用单次SHA512,而是用PBKDF2-HMAC-SHA512(带迭代次数的密钥派生)。你可以尝试常见的迭代次数(1000、2000、10000、100000),生成64字节的派生值后转Base64对比:
示例代码:
public static string GeneratePbkdf2Hash(string password, string salt, int iterations, Encoding encoding) { byte[] passwordBytes = encoding.GetBytes(password); byte[] saltBytes = encoding.GetBytes(salt); using (var pbkdf2 = new Rfc2898DeriveBytes(passwordBytes, saltBytes, iterations, HashAlgorithmName.SHA512)) { byte[] hashBytes = pbkdf2.GetBytes(64); // SHA512对应64字节 return Convert.ToBase64String(hashBytes); } }
3. 检查是否有额外的固定字符串或盐处理
有些工具会在密码前后拼接固定字符串(如"APP_PREFIX_" + password + salt + "_APP_SUFFIX"),或者对盐做预处理:
- 反转盐的字节/字符串
- 取盐的部分字节(比如只取前8字节或后8字节)
- 将盐视为十六进制字符串,先转成字节数组(比如16位的盐字符串如果是十六进制,实际对应8字节的盐)
4. 尝试链式哈希操作
测试多次哈希的情况:
- 先哈希密码,再将哈希结果与盐组合后再次哈希
- 先组合密码和盐,哈希后重复哈希N次(比如2次、3次)
5. 批量穷举常见模式
写一个简单的遍历工具,自动尝试所有常见参数组合(编码、顺序、迭代次数、固定字符串),一旦生成的哈希与目标匹配,即可确定逻辑。
内容的提问来源于stack exchange,提问作者kontrolltermin
相关产品推荐
相关产品推荐

