这个是调用的unix crypt函数(MD5-based password hashing algorithm)实现的.我没找到这个函数的C#实现可以达到相同结果.不过有linux C代码可以得到相同结果:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <crypt.h>
#include <string.h>
int main() {
const char *password = "a0.123456";
const char *salt = "$1$jz$";
// 如果你的系统支持 crypt_r, 使用它以确保线程安全
struct crypt_data data;
memset(&data, 0, sizeof(data)); // 初始化 crypt_data 结构
// 调用 crypt_r 函数进行哈希
char *hashedPassword = crypt_r(password, salt, &data);
if (hashedPassword == NULL) {
fprintf(stderr, "Hashing failed.\n");
return EXIT_FAILURE;
}
printf("Hashed password: %s\n", hashedPassword);
return EXIT_SUCCESS;
}
Hashed password: $1$jz$9dsUa0P7OlWGfuMQAs7NG0
你这个盐其实是这个 "$1$jz",怪不得我找半天找不到C#结果一样的...
PHP 的 crypt
函数用于生成加密字符串,如果你使用的是 MD5 加密,且其格式为 $1$
开头,这指的是可以通过“crypt”模式来处理密码。由此可知,这使用了 MD5 加盐的形式。
以下是一个用 C# 实现 MD5 Crypt 的示例代码,以便你能验证 PHP 中生成的加密字符串。这里我们将实现 MD5 加盐的加密逻辑。
crypt
功能using System;
using System.Security.Cryptography;
using System.Text;
public class Program
{
public static void Main()
{
string password = "a0.123456";
string salt = "$1$jz$";
string hashed = Crypt(password, salt);
Console.WriteLine(hashed);
}
public static string Crypt(string password, string salt)
{
if (!salt.StartsWith("$1$"))
throw new ArgumentException("Salt must begin with '$1$' for MD5.");
int saltLength = salt.Length - 3; // Remove $1$ prefix and get actual salt length
string saltOnly = salt.Substring(3, saltLength); // actual salt without prefix
// Generate the MD5 hash
using (var md5 = MD5.Create())
{
string hash = md5.ComputeHash(Encoding.UTF8.GetBytes(password + saltOnly)).ToHex();
return $"$1${saltOnly}${hash}";
}
}
}
// Extension method to convert byte array to Hex string
public static class Extensions
{
public static string ToHex(this byte[] bytes)
{
StringBuilder result = new StringBuilder();
foreach (byte b in bytes)
{
result.Append(b.ToString("x2")); // Convert to hex format
}
return result.ToString();
}
}
$1$
表示 MD5 加盐,你需要确保 C# 代码中的盐总是遵循与 PHP 生成的盐相同的格式。如果使用上面的代码进行测试,你会发现返回的哈希值与 PHP 中使用 crypt
函数生成的相同字符串。这样,你就可以在 C# 中进行验证和比较了。
这段代码主要实现了 MD5 加盐的简单逻辑,如果你需要更复杂的逻辑(如对相同密码生成不同结果),可能需要进一步的实现。希望这能帮到你!如果还有其他问题或需要进一步的解释,请告诉我!
你这个不对的,实际得到值和PHP生成的不一样
我用了CryptSharpOfficial这个包实现了,虽然不知道他怎么实现