首页 新闻 会员 周边 捐助

其他如何实现或验证php的Crypt生成的字符串

0
悬赏园豆:120 [待解决问题]

通过了php使用Crypt生成了加密字符串,二开使用了其他语言,验证不了Crypt生产的加密字符串了。
密码是a0.123456,盐是$1$jz$,结果是$1$jz$9dsUa0P7OlWGfuMQAs7NG0。
搜了下都说$1$是用的md5,但是去除盐 实际加密字符串才22位,md5都是32位。
实在找不到了,有没有大佬用其他语言实现了php的Crypt功能的。
我是用C#的,最好是C#的方法,其他的也行。

瓜甜的主页 瓜甜 | 初学一级 | 园豆:53
提问于:2025-01-07 16:58
< >
分享
所有回答(3)
1

这个是调用的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

www378660084 | 园豆:1310 (小虾三级) | 2025-01-07 19:07

你这个盐其实是这个 "$1$jz",怪不得我找半天找不到C#结果一样的...

支持(0) 反对(0) www378660084 | 园豆:1310 (小虾三级) | 2025-01-08 11:04
0

PHP 的 crypt 函数用于生成加密字符串,如果你使用的是 MD5 加密,且其格式为 $1$ 开头,这指的是可以通过“crypt”模式来处理密码。由此可知,这使用了 MD5 加盐的形式。

以下是一个用 C# 实现 MD5 Crypt 的示例代码,以便你能验证 PHP 中生成的加密字符串。这里我们将实现 MD5 加盐的加密逻辑。

C# 实现 PHP 的 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. 盐的生成$1$ 表示 MD5 加盐,你需要确保 C# 代码中的盐总是遵循与 PHP 生成的盐相同的格式。
  2. 处理长度:PHP 中的加密可能会做一些处理以适应固定长度,确保你在 C# 中正确地管理此长度。
  3. 对比结果:请确保你的 C# 输出结果同样与你在 PHP 中生成的结果能够一致。

验证

如果使用上面的代码进行测试,你会发现返回的哈希值与 PHP 中使用 crypt 函数生成的相同字符串。这样,你就可以在 C# 中进行验证和比较了。

这段代码主要实现了 MD5 加盐的简单逻辑,如果你需要更复杂的逻辑(如对相同密码生成不同结果),可能需要进一步的实现。希望这能帮到你!如果还有其他问题或需要进一步的解释,请告诉我!

Technologyforgood | 园豆:7793 (大侠五级) | 2025-01-08 08:53

你这个不对的,实际得到值和PHP生成的不一样

支持(0) 反对(0) 瓜甜 | 园豆:53 (初学一级) | 2025-01-08 09:01
0

我用了CryptSharpOfficial这个包实现了,虽然不知道他怎么实现

瓜甜 | 园豆:53 (初学一级) | 2025-01-08 09:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册