Я пытаюсь скомпилировать программное обеспечение, написанное на 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 *
Если мне нужно еще кое-что добавить, дайте мне знать!