gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 06:40:23 25 4
gpt4 key购买 nike

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

我们希望在新应用程序中继续使用旧网站的登录信息。

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

是否可以在 .NET 或 微软 SQL?

感谢任何帮助/链接。

最佳答案

根据 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();
}

关于.net - 使用 .NET 或 MS SQL 模拟 MySql 的 password() 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/868482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com