Есть ли в Vb.Net эквивалент крипты PHP ($ string, $ salt)?Не могу найти / создать с помощью $ salt - PullRequest
4 голосов
/ 27 марта 2019

Я пытаюсь скомпилировать программное обеспечение, написанное на VB (я использую VisualStudio2010, Framework 4), которое позволяет пользователям изменять свои пароли на веб-сайте (к сожалению, форма сменного пароля по умолчанию для веб-сайта не работает, и я не могу исправить это через PHP).

У меня нет большого опыта работы с PHP и шифрованием, поэтому я искал в Интернете некоторые решения для VB.Net, но не получил ожидаемых результатов после 2 дней попыток.

Я провел некоторое исследование, и вот что я узнал: PHP-код сайта использует функцию crypt ($ string, $ salt) для создания хешированного пароля. Кодировка - это алгоритм MD5, так как моя соль - что-то вроде «$ 1 $ ad000000 $» для каждого пароля в базе данных сайта.

Я попытался скопировать его в VB, и проблемы начинаются с ComputeHash (buffer () как Byte), так как он не поддерживает строку "Salt".

Код на PHP так же прост:

$EncryptedPassword = crypt($userPassword, $salt);

Соль генерируется, например, для "$ 1 $ ad000000 $"

Длина $ EncryptedPassword равна 34 (12salt + 22hash), но я предполагаю, что это стандартная длина функции crypt () с учетом конкретной соли.

Вот что я сейчас пытаюсь на VB:

Dim Hashata = GetHash("asdkFAofkas", "$1$ad000000$")

Private Function GetHash(ByVal p1 As String, ByVal Salt As String) As Object
        Using hasher As MD5 = MD5.Create()
            Dim dbytes As Byte() = hasher.ComputeHash(Encoding.UTF8.GetBytes(p1 & Salt))
            Dim Conversione = Convert.ToBase64String(dbytes)
            Return Conversione
        End Using
    End Function

Возвращаемая строка представляет собой 24-символьную строку, всегда заканчивающуюся "==", независимо от того, что такое "p1", и я прочитал в Интернете, что эти два последних символа являются необязательными, поэтому при создании хэша пароля с помощью Salt Я просто делаю:

Dim StoredPassword = Salt & Hashata.Substring(0,Hashata.Length-2)

Созданный StoredPassword (VB) не совпадает с паролем (PHP) в базе данных, когда я пишу тот же пароль. Я попытался сделать это с созданием нескольких пользователей на веб-сайте с одним и тем же паролем, и все они одинаково хешируются в базе данных.

Например, вот что у меня в базе данных:

-------------------------------------------------
| Username | Password                           |
-------------------------------------------------
|test1     |$1$ad000000$kcpPLtMxsedGD0d39UnXQg  |
-------------------------------------------------
|test2     |$1$ad000000$kcpPLtMxsedGD0d39UnXQg  |
-------------------------------------------------
|test3     |$1$ad000000$kcpPLtMxsedGD0d39UnXQg  |
-------------------------------------------------
|testVB    |$1$ad000000$5u-9pdu3HDnXt5pGdXZNug  |
-------------------------------------------------

test1, test2, test3 имеют пароли, сделанные на сайте

testVB имеет пароль, сгенерированный функцией VB выше

Я написал один и тот же пароль для test1, test2, test3 и testVB.

ВСЕ пароли в базе данных имеют длину 34 символа

Я уже попробовал следующее (на VB, так как не могу изменить PHP сайта):

  • Кодировать только p1, только Salt, обе переменные смешаны (как в коде выше)

  • Преобразуйте p1 и Salt в шестнадцатеричную строку (сначала только одну, затем только другую, затем обе, и т. Д.) Перед кодированием их по отдельности или во время их смешивания

  • Использование различных типов кодирования (UTF-7, UTF-16, UTF-32, «По умолчанию» и ASCII)

Я почти уверен, что проблема связана с функцией ComputeHash, у которой нет свойства "Salt" (у нее есть свойства offset и count, но я их не использовал), и без этого она может Не склеивайте так, как мне хотелось бы.

Есть ли способ реплицировать функцию PHP crypt ($ string, $ salt)?

Могу поспорить, что без $ salt они совпадают (я уже нашел некоторые решения, которые работали бы так, но мне нужна эта соль для шифрования, потому что я не могу изменить PHP-код сайта для шифрования без $ salt).

Большое спасибо, извините за долгое чтение, я хочу убедиться, что я ничего не пропустил :) 1066 *

Если мне нужно еще кое-что добавить, дайте мне знать!

...