【问题标题】:PHP crypt() function in .Net?.Net 中的 PHP crypt() 函数?
【发布时间】:2010-09-25 12:46:22
【问题描述】:

我正在用 ASP.NET MVC 重写一个 PHP 网站。我想保持相同的用户群,但使用 PHP crypt() 函数对密码进行哈希处理。我需要在 .Net 中使用相同的功能,以便我可以在登录时散列密码,并根据用户数据库中的散列密码检查它。

在这种情况下,crypt 使用 CRYPT_MD5 实现 - 哈希都以 $1$ 开头

我试过 Phalanger,但它没有 crypt 函数的 MD5 实现。

有人知道.Net 中的一个吗? CodeProject 上 crypt() 的 C# 示例使用的是 DES,而不是 MD5。

我在 C# 中尝试了以下代码,使用不同的 salt+password、password+salt 和 salt 排列,有和没有 $1$ 前缀和 $ 后缀。没有给出与 PHP 相同的结果:

static void Main(string[] args)
{
    const string salt = "somesalt";
    const string password = "fubar";
    const string plaintextString = password + salt;
    byte[] plaintext = GetBytes(plaintextString);
    var md5 = MD5.Create("MD5");
    byte[] hash = md5.ComputeHash(plaintext);
    string s = System.Convert.ToBase64String(hash);
    Console.WriteLine("Hash of " + password + " is " + s);
    Console.ReadKey();
}

private static byte[] GetBytes(string s)
{
    var result = new byte[s.Length];
    for (int i = 0; i < s.Length; i++)
        result[i] = (byte)s[i];
    return result;
}

【问题讨论】:

  • MD5 不被视为安全哈希,您可能希望将系统升级到 SHA-256。
  • 顺便说一句,Console.WriteLine("Hash of {0} is {1}", password, s);
  • Abatishchev,这是检查我是否可以为给定的输入字符串生成与 PHP 相同的哈希值的快速峰值。您的评论完全偏离主题,没有什么帮助。

标签: php .net asp.net security encryption


【解决方案1】:

有一些用于 md5 散列的 .NET 方法,System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, format) 是最容易使用的,尽管它是一个拗口。只需将“md5”作为格式传递即可。

根据 PHP 是如何做到这一点的,它可能就像在导入时将 $1$ 从哈希的开头切掉一样简单。它可能更复杂。如果您可以发布一个示例密码/哈希,我会看看我是否可以想出一些 C# 来为您从该密码生成相同的哈希。

【讨论】:

  • 我在 .Net 中尝试过 MD5 散列,但它产生的散列与我使用 PHP crypt() 看到的散列不同
【解决方案2】:

你看过 .NET MD5 class 吗? $1$ 是 12 个字符的盐的一部分。

【讨论】:

    【解决方案3】:

    至少这些看起来很有希望。

    unix md5crypt 用于 CRYPT_MD5$1$ 盐。

    A C# implementation of Unix crypt() 用于 DES)

    【讨论】:

      【解决方案4】:

      我目前正在处理完全相同的问题。我想出的解决方案是直接通过外部调用调用php函数:

      [DllImport( "php5ts.dll", EntryPoint = "crypt", CharSet = CharSet.Ansi )]
      private static extern string crypt( string str, string salt );
      

      当运行本地 WebDev 服务器、IIS5 和 IIS6 时,这适用于 php 版本 5.2.10,但如果您使用 II7,ASP.Net 工作进程会因未处理的异常而崩溃。 (我会在找到解决方案后立即更新我的答案)

      我们还包括一个密码类型标志,允许我们为所有新用户使用 .Net MD5 实现,并在现有用户更新其详细信息时无缝转换。

      更新: 直接从 IIS7 引用 php5ts.dll 的问题似乎很可能归结为使用 64 位 Windows,因此此解决方案可能适用于 32 位 Windows 7 或 Server 2008 安装,但是我无法验证这一点。事实证明,我们现有的站点正在使用 DES,因此我们能够使用 CodeProject 的 crypt 实现,感谢 Mike 的参考。

      【讨论】:

        【解决方案5】:

        我找到的唯一解决方案是调用一个简单的 PHP 脚本,该脚本只需执行输入字符串的哈希并返回它:-(

        【讨论】:

          猜你喜欢
          • 2013-06-04
          • 1970-01-01
          • 1970-01-01
          • 2014-07-01
          • 2011-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多