Моделирование пароля MySql () шифрование с помощью.NET или MS SQL

Вам необходимо поместить информацию о переопределении в один из файлов конфигурации Cargo . Например, для harfbuzz-sys вы можете поместить это в .cargo/config внутри вашей рабочей области:

[target.machine-vendor-os.harfbuzz]
rustc-link-search = ["/path/to/staging/usr/lib"]
rustc-link-lib = ["harfbuzz"]

Обратите внимание, что в первой строке:

  • machine-vendor-os должно быть совпадает со значением, которое вы задаете для груза с помощью опции --target.
  • harfbuzz должен совпадать с ключом links, определенным в Cargo.toml вашей зависимости.

А во второй строке /path/to/staging/usr/lib - это путь, по которому ваша предварительно скомпилированная зависимость находится в системе сборки.

6
задан Thomas Stock 15 May 2009 в 12:46
поделиться

5 ответов

Согласно документации MySQL, алгоритм представляет собой двойной хэш SHA1. Изучая исходный код MySQL, вы обнаружите функцию make_scrambled_password () в libmysql / password.c. Функция определяется следующим образом:

/*
    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. Этот метод возвращает тот же результат, что и вызов PASSWORD () в MySQL. Надеюсь, это вам поможет.

Изменить: Вот тот же код на 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();
}
13
ответ дан 8 December 2019 в 18:41
поделиться

Вы можете зашифровать строки с помощью MD5 или SHA1 в .Net, но фактический алгоритм, используемый MySQL, вероятно, отличается от этих двух методов. , Я подозреваю, что он основан на какой-то «соли», основанной на экземпляре сервера, но я не знаю.

Теоретически, поскольку я считаю, что MySQL является открытым исходным кодом, вы можете исследовать источник и определить, как он сделано.

http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#function_password

Редактировать 1: Я считаю, что используемый алгоритм представляет собой двойной SHA1 с другими «хитростями» (согласно этой записи в блоге ).

1
ответ дан 8 December 2019 в 18:41
поделиться

Вы не сможете имитировать функцию MySql password (). по крайней мере, не без большого труда и удачи. Поскольку MySql использует свой собственный алгоритм для одностороннего шифрования строк, они не собираются раскрывать, какой алгоритм они используют; Это означает, что вам придется выполнять метод проб и ошибок, сравнивать полученные строки и т. д.

Чтобы исправить вашу проблему:

Я бы скопировал базу данных, но поддерживал соединение с MySql. Используйте флаг для идентификации первого входа в систему. Попросите их использовать текущий пароль; проверьте пароль с помощью функции MySql password (). Если пароль действительный; попросите их сбросить пароль, введя тот же пароль еще раз или новый; на этом этапе используйте ваш любимый алгоритм шифрования и сохраните результат в своей базе данных MS Sql.

Я знаю, что это звучит как неприятность,

-3
ответ дан 8 December 2019 в 18:41
поделиться

Для сети VB это дополняет нулями слева, так что, когда шестнадцатеричный код [например] «E», эта функция правильно добавит «0E» в строку результата. Таким образом, в конечном итоге, включая добавленный в начало '*', результирующая строка будет иметь длину 41 символ, как требуется в MySQL

Public Function GenerateMySQLHash(ByVal strKey As String) As String

    Dim keyArray As Byte() = System.Text.UTF8Encoding.UTF8.GetBytes(strKey)
    Dim enc = New Security.Cryptography.SHA1Managed()
    Dim encodedKey = enc.ComputeHash(enc.ComputeHash(keyArray))
    Dim myBuilder As New System.Text.StringBuilder(encodedKey.ToString.Length)

    For Each b As Byte In encodedKey
        myBuilder.Append(Strings.Right("0" & b.ToString("X"), 2))
    Next

    Return "*" & myBuilder.ToString()
End Function
0
ответ дан 8 December 2019 в 18:41
поделиться

"они не собираются раскрывать то, что алгоритм, который они используют "

эм ... кто-то должен проснуться и сказать вам, что MySQL - это ОТКРЫТЫЙ ИСТОЧНИК ...им не нужно что-то «раскрывать», потому что каждый может прочитать саму структуру базы данных - просто скачайте исходники, найдите функции шифрования (я думаю, они используют C ++) и начните исследовать ... SHA1 сейчас кажется довольно небезопасным - совсем недавно несколько ученых доказали, что можно выбрать до 20% данных без ограничений и получить тот же хэш , так что можно посоветовать использовать AES или SHA2 (следовательно, не MySQL- PASSWORD -функция)

1
ответ дан 8 December 2019 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: