当前位置: 首页 > 面试题库 >

使用.NET或MS SQL模拟MySql的password()加密

姚煜
2023-03-14
问题内容

我正在将旧的ASP / MySql Webapp更新为ASP.NET/MS SQL。

我们希望保持旧网站的登录信息在新应用中正常运行。

不幸的是,密码是使用MySql的password()函数存储在MySql DB中的。

是否可以在.NET或MS SQL中模拟MySql的password()函数?

任何帮助/链接表示赞赏。


问题答案:

根据MySQL文档,该算法是双SHA1哈希。在检查MySQL源代码时,您会在libmysql /
password.c中找到一个名为make_scrambled_pa​​ssword()的函数。该函数定义如下:

/*
    MySQL 4.1.1 password hashing: SHA conversion (see RFC 2289, 3174) twice
    applied to the password string, and then produced octet sequence is
    converted to hex string.
    The result of this function is used as return value from PASSWORD() and
    is stored in the database.
  SYNOPSIS
    make_scrambled_password()
    buf       OUT buffer of size 2*SHA1_HASH_SIZE + 2 to store hex string
    password  IN  NULL-terminated password string
*/

void
make_scrambled_password(char *to, const char *password)
{
  SHA1_CONTEXT sha1_context;
  uint8 hash_stage2[SHA1_HASH_SIZE];

  mysql_sha1_reset(&sha1_context);
  /* stage 1: hash password */
  mysql_sha1_input(&sha1_context, (uint8 *) password, (uint) strlen(password));
  mysql_sha1_result(&sha1_context, (uint8 *) to);
  /* stage 2: hash stage1 output */
  mysql_sha1_reset(&sha1_context);
  mysql_sha1_input(&sha1_context, (uint8 *) to, SHA1_HASH_SIZE);
  /* separate buffer is used to pass 'to' in octet2hex */
  mysql_sha1_result(&sha1_context, hash_stage2);
  /* convert hash_stage2 to hex string */
  *to++= PVERSION41_CHAR;
  octet2hex(to, (const char*) hash_stage2, SHA1_HASH_SIZE);
}

使用此方法,您可以创建一个基本上执行相同操作的.NET副本。这是我想出的。当我运行SELECT PASSWORD(’test’);
针对我的MySQL本地副本,返回的值是:

*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29

根据源代码(再次在password.c中),星号开头表示这是MySQL 4.1之后的加密密码方法。例如,当我在VB.Net中模拟功能时,这就是我想出的:

Public Function GenerateMySQLHash(ByVal strKey As String) As String
    Dim keyArray As Byte() = Encoding.UTF8.GetBytes(strKey)
    Dim enc = New SHA1Managed()
    Dim encodedKey = enc.ComputeHash(enc.ComputeHash(keyArray))
    Dim myBuilder As New StringBuilder(encodedKey.Length)

    For Each b As Byte In encodedKey
        myBuilder.Append(b.ToString("X2"))
    Next

    Return "*" & myBuilder.ToString()
End Function

请记住,SHA1Managed()在System.Security.Cryptography命名空间中。此方法返回的输出与MySQL中的PASSWORD()调用相同。希望对您有帮助。

编辑:这是C#中的相同代码

public string GenerateMySQLHash(string key)
{
    byte[] keyArray = Encoding.UTF8.GetBytes(key);
    SHA1Managed enc = new SHA1Managed();
    byte[] encodedKey = enc.ComputeHash(enc.ComputeHash(keyArray));
    StringBuilder myBuilder = new StringBuilder(encodedKey.Length);

    foreach (byte b in encodedKey)
        myBuilder.Append(b.ToString("X2"));

    return "*" + myBuilder.ToString();
}


 类似资料:
  • 我在这里按照步骤使用Azure DocumentDB模拟器:https://docs . Microsoft . com/en-us/Azure/cosmos-db/local-emulator 我的项目文件如下所示: 其他人有这个问题或者知道如何解决它吗?

  • 使用。NET核心IoC容器注入工厂,该方法所做的是从工厂创建一个新客户机: 然后使用客户机从REST服务获取数据:

  • 问题内容: 有一条消息(文本),我肯定知道其格式和内容。 目前,已经实现了Java类,该类从文件中解析并读取此消息。 在现实世界中,此消息将来自消息队列。 现在,我应该在本地PC上模拟,模拟或生成Message Queue,以进行测试。 Java规范(java jms ): 关于此规范,我需要 JMS provider 。 JMS客户端 -这是我的类,它读取消息。 消息 本身,我知道。 那么问题是

  • 问题内容: 在配置项过程中登录时出现此错误: 我应该将“ –password”替换为“ –password-stdin”吗? 问题答案: 根据Docker文档: 要以非交互方式运行docker login命令,可以将 标志设置为通过STDIN提供密码。使用STDIN可以防止密码出现在shell的历史记录或日志文件中。 以下示例从文件读取密码,然后使用STDIN将其传递给docker login命令

  • 我需要在iPhone或iPad上加密字符串(实际上是XML文件),然后用.NET应用程序解密。感谢David Veksler在这里提出的问题“.NET和iPhone之间的AES互操作性?”,以及在这里发表的博客文章http://automagical.rationalmind.net/2009/02/12/aes-interoperability-between-net-and-iPhone/。

  • 问题内容: 我写了一个Google Chrome扩展程序,要在其上使用扩展程序的网站要求我单击或制表到文本框(因为我认为它仅运行javaScript验证“ onClick”)。我可以使用以下扩展名在框中输入带有扩展名的文本: 但是,当我单击提交时,它认为我没有在“ input1”文本框中输入任何内容,因为我从未单击过它或在其上使用选项卡。 有人可以帮我解决这个问题吗? 问题答案: 模拟鼠标单击 我