Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[TuT]Bezpieczny system logowania w AutoIT


Rekomendowane odpowiedzi

Opublikowano

Witam.

Dzisiaj pokażę jak zrobić bezpieczny system logowania do swojego programu w AutoIT.

 

Sama metoda jest znana i stara jak świat - hashowanie danych, czyli nieodwracalne kodowanie ich

Ktoś o tym kiedyś wspomniał a ja piszę właśnie o tym tutka.

 

Co nam będzie potrzebne?

Pewna biblioteka z paczki którą możemy pobrać tutaj, a jak ktoś nie chce paczki to tutaj ma samą bibliotekę.

 

Okej, zakładam że pobraliśmy.

Info dla pobierających paczkę - wypakowujemy ją i wchodzimy w folder Hash - witamy w raju, macie parędziesiąt bibliotek a każda ma inny sposób hashowania. Ja posłużę się popularnym MD5. Czyli skopiujmy gdzieś MD5.au3, stwórzmy autoitowy plik w tym samym miejscu i możemy już robić #include "MD5.au3"

 

Hashowanie danych to banał.

Tutaj służy do tego funkcja _MD5($dane)

 

Przykładzik:

#include "MD5.au3"

$data = "mpcforum.pl"
$data_hash = _MD5($data)

MsgBox(0, 'Rezulat', 'Oryginalne dane: '&$data&@CRLF&'Dane shashowane: '&$data_hash)

 

A jak tego użyć przy na przykład logowaniu?

Taki przykładzik z użyciem InputBoxa:

#include "MD5.au3"

$haslo = '0xB3D97746DBB45E92DC083DB205E1FD14' ;nasze shashowane hasło

For $i = 1 To 3 Step +1
$proba = InputBox("Logowanie - próba "&$i, "Wpisz hasło:")
If _MD5($proba) = $haslo then
MsgBox(0, 'OK', 'Poprawne hasło!')
Exit
EndIf
Next

MsgBox(0, 'Oj', 'Chyba nie zgadłes')

 

Hasło w spoilerze:

 

phoenix

 

 

I jak widzimy działa. I jakbym nie podał hasła to możnaby tego próbować do usranej śmierci.

Tyle na dzisiaj, miłej zabawy, DOBRANOC :D

 

I jeszcze mały bonusik - Sprawdzanie hasła metodą klient-serwer, co jest jedną z najbardziej bezpiecznych metod (przy odpaleniu serwera trzeba mieć MD5.au3 w folderze Include albo w folderze ze skryptem):

 

Klient

 

TCPStartup()

;łączenie z serwerem
Global $TCP = TCPConnect('25.87.171.83', 1053)
If $TCP = -1 Then
   MsgBox(16, 'Błąd!', 'Nie mozna połączyć z serwerem!')
   Exit
EndIf

Local $proba, $info

;trzy próby wpisania hasła - wystarczające zabezpieczenie
For $i = 1 To 3 Step +1
   ;najpierw wpisujemy i wysyłamy hasło do serwera
   $proba = InputBox('Hasło', 'Wpisz hasło - zostało '&4-$i&' prób')
   TCPSend($TCP, $proba)

   ;teraz czekamy na odpowiedź serwera
   Do
       $info = TCPRecv($TCP, 5) ;5 znaków w zupełnosci wystarczy
   Until $info <> ''

   ;i kiedy dostalismy odpowiedź, sprawdzamy ją
   If $info = 'tak' Then
       MsgBox(64, 'Hasło', 'Hasło prawidłowe!')
       end() ;patrz nizej
   ElseIf $info = 'nie' Then
       MsgBox(48, 'Hasło', 'Hasło nieprawidłowe!')
   Else
       MsgBox(48, 'Błąd', 'Nieprawidłowa odpowiedź od serwera - '&$info)
   EndIf

   Sleep(1000) ;ale dla pewnosci dodam sleepa
Next

Func end() ;zrobiłem funkcję zamykającą połaczenia i wyłączającą program dla wygody
   TCPSend($TCP, 'end')
   TCPCloseSocket($TCP)
   TCPShutdown()
   Exit
EndFunc

 

 

Serwer

 

#include <MD5.au3>
TCPStartup()

;zmienna z zhashowanym hasłem
Global Const $Haslo = "0x6ED9F5BF051E06F00C38CC8699AD6922"

;odpalanie serwera
$TCP = TCPListen('25.87.171.83', 1053)
If @error Then
   MsgBox(16, 'Błąd!', 'Nie mozna uruchomić serwera!')
   Exit
EndIf

;czekanie na klienta
Global $Socket
Do
   $Socket = TCPAccept($TCP)
Until $Socket <> -1

;czekanie na podane przez usera hasło wysłane na serwer
;umieszczam wszystko w pętli zeby serwer tez naliczał 3 próby, jakby któs udupił klienta
AdlibRegister('checkshutdown', 500)
Local $recv
For $i = 1 To 3 Step +1
   Do
       $recv = TCPRecv($Socket, 1024)
   Until $recv <> ''

   ;i sprawdzanie czy hasło sie zgadza czy nie...
   If _MD5($recv) = $Haslo Then
       TCPSend($Socket, 'tak')
   Else
       TCPSend($Socket, 'nie')
   EndIf
Next

;zamykanie wszystkiego
TCPCloseSocket($Socket)
TCPCloseSocket($TCP)
TCPShutdown()

Func checkshutdown() ;i mała funkcja która spowoduje ze serwer sie wyłaczy po dostaniu info od klienta
   If TCPRecv($Socket, 5) = 'end' Then
       TCPCloseSocket($Socket)
       TCPCloseSocket($TCP)
       TCPShutdown()
   EndIf
EndFunc

 

 

Hasło to

Test MD5 Klient-Serwer

846331404756772371599.jpeg
Opublikowano

masz pecha, hasło było tak proste ze 5 s wystarczyło odczytać ;)

 

lepiej bardziej komplikować hasło albo dołozyc dowolny algorytm do zaszyfrowania jeszcze ;)

 

www.google.pl/search?q=B3D97746DBB45E92DC083DB205E1FD14

If you = stupid then

insert(foot.in.your.ass)

end if

licznik-54-96732-stat.png

Opublikowano
I jak widzimy działa. I jakbym nie podał hasła to możnaby tego próbować do usranej śmierci.

BruteForce

 

Nie lepiej zakodować innym hashem :D?

Wszystkie poradniki w "O mnie" i na moim profilu YouTube.


51dd70965ae71.png


!!!HIT!!! -- Pełno klientów na DT nawet na najstarszym kompie bez zamuły!


!!!HIT!!! -- Nowa modyfikacja do Metina FastKill


World of Metin2


Opublikowano

no to powodzenia przy nie znamym i nawet nie skomplikowanym haśle , kilka tygodni ci to zajmie bo to akurat najwolniejsza metoda z możliwych

 

MD5 nie ma możliwości nigdy zdeszyfrować w warunkach domowych

If you = stupid then

insert(foot.in.your.ass)

end if

licznik-54-96732-stat.png

Opublikowano

no to powodzenia przy nie znamym i nawet nie skomplikowanym haśle , kilka tygodni ci to zajmie bo to akurat najwolniejsza metoda z możliwych

 

MD5 nie ma możliwości nigdy zdeszyfrować w warunkach domowych

oclHashCat raczej dałby radę ;x.

Wszystkie poradniki w "O mnie" i na moim profilu YouTube.


51dd70965ae71.png


!!!HIT!!! -- Pełno klientów na DT nawet na najstarszym kompie bez zamuły!


!!!HIT!!! -- Nowa modyfikacja do Metina FastKill


World of Metin2


Opublikowano

Warto jeszcze posolić hashe :)

Uchroni to przed google hackingiem łatwych haseł, oraz prostymi tęczowymi tablicami.

mjut.png
Opublikowano

co za problem, szyfrowanie hashowanych danych albo jeszcze przed hashem i z bani :D

Można jeszcze się posłużyć trickami typu _StringToHex/_HexToString i _StringReverse co stworzyłoby zagadkę dla próbującego odczytać hasło xD

846331404756772371599.jpeg
Opublikowano

lepiej:

$haslo = "blabla"
$hash = _MD5($haslo)

$haslo = "blabla"
$hash = _MD5($haslo)
$hash = _MD5($hash)

Opublikowano

no to powodzenia przy nie znamym i nawet nie skomplikowanym haśle , kilka tygodni ci to zajmie bo to akurat najwolniejsza metoda z możliwych

 

MD5 nie ma możliwości nigdy zdeszyfrować w warunkach domowych

 

Naprawde Ciekawe, gdzie to slyszales ;)

Widocznie jestem w labolatorium

I zalerzy jakie haslo.

table_name,9,10,11 from information_schema.tables

 

Opublikowano

Jeśli ustawisz sześcio-siedmioznakowe hasło z małymi/dużymi literami i cyframi to już ktoś ma parę lat żeby to odczytać.

Jeszcze jak dowalisz do tego podwójny hash oraz jakieś niespodzianki typu konwersja do HEX czy szyfrowanie to jest to do odczytania w przeciągu paru dekad. Przy użyciu porządnego serwera, a nawet całej serwerowni rzecz jasna.

846331404756772371599.jpeg
Opublikowano

Jeśli ustawisz sześcio-siedmioznakowe hasło z małymi/dużymi literami i cyframi to już ktoś ma parę lat żeby to odczytać.

Jeszcze jak dowalisz do tego podwójny hash oraz jakieś niespodzianki typu konwersja do HEX czy szyfrowanie to jest to do odczytania w przeciągu paru dekad. Przy użyciu porządnego serwera, a nawet całej serwerowni rzecz jasna.

  • MD5
  • inne Hash'e
  • Binary
  • ASCII
  • Hex
  • StringReverse
  • szyfry własne

Opublikowano

Jeśli ustawisz sześcio-siedmioznakowe hasło z małymi/dużymi literami i cyframi to już ktoś ma parę lat żeby to odczytać.

Jeszcze jak dowalisz do tego podwójny hash oraz jakieś niespodzianki typu konwersja do HEX czy szyfrowanie to jest to do odczytania w przeciągu paru dekad. Przy użyciu porządnego serwera, a nawet całej serwerowni rzecz jasna.

W dzisiejszych czasach takie hashe sześcio-siedmioznakowych haseł łamie się stosunkowo szybko w chmurze :)

mjut.png
Opublikowano

To wystarczy dodać po każdej próbie Sleep(5000). Dla:

  • IP +działa +tylkonazłego -złymożesięskądindziejzalogować
  • Wszystkich +działa +nawszystko - możnablokowaćtakiemiejsce
  • Nikogo +małoroboty -pocotokomu

Opublikowano

$proba = InputBox("Logowanie - próba "&$i, "Wpisz hasło:")
If _MD5($proba) = $haslo then

Nie można zapisać jako

If _MD5(InputBox("Logowanie - próba "&$i, "Wpisz hasło:")) == $hash then

?

Opublikowano

@up i to jest rozwiązanie godne nobla xD

Ale ma rację, wstawiasz nawet 1s sleepa i już zamiast tygodnia hasło się łamie w parę miechów.

Oczywiście jeśli nikt go nie wyciągnie z programu ^^

Jest godne N00bla

Już łatwiej zdekompilować, fakt...

Ale client-server.

Client wysyła hasło niekodowane a serwer True lub False.

Do tego mechanizm z Sleep'em.

Oraz wrzucić MD5, Binary, Hex, ASCII połączone & i StringReverse.

StringReverse walnąć gdzieś pośrodku.

 

$proba = InputBox("Logowanie - próba "&$i, "Wpisz hasło:")
If _MD5($proba) = $haslo then

Nie można zapisać jako

If _MD5(InputBox("Logowanie - próba "&$i, "Wpisz hasło:")) == $hash then

?

Istnieje coś takiego jak dbanie o czystość i klarowność kodu...

Opublikowano

Na pomysł z klientem-serwerem nie wpadłem, ale jest dobry.

Zaraz coś ci napiszę jako sampla, bo akurat mam wolne.

 

A łap to sobie, jeszcze walnę to w topicu:

 

Klient

 

TCPStartup()

;łączenie z serwerem
Global $TCP = TCPConnect('25.87.171.83', 1053)
If $TCP = -1 Then
   MsgBox(16, 'Błąd!', 'Nie mozna połączyć z serwerem!')
   Exit
EndIf

Local $proba, $info

;trzy próby wpisania hasła - wystarczające zabezpieczenie
For $i = 1 To 3 Step +1
   ;najpierw wpisujemy i wysyłamy hasło do serwera
   $proba = InputBox('Hasło', 'Wpisz hasło - zostało '&4-$i&' prób')
   TCPSend($TCP, $proba)

   ;teraz czekamy na odpowiedź serwera
   Do
       $info = TCPRecv($TCP, 5) ;5 znaków w zupełnosci wystarczy
   Until $info <> ''

   ;i kiedy dostalismy odpowiedź, sprawdzamy ją
   If $info = 'tak' Then
       MsgBox(64, 'Hasło', 'Hasło prawidłowe!')
       end() ;patrz nizej
   ElseIf $info = 'nie' Then
       MsgBox(48, 'Hasło', 'Hasło nieprawidłowe!')
   Else
       MsgBox(48, 'Błąd', 'Nieprawidłowa odpowiedź od serwera - '&$info)
   EndIf

   Sleep(1000) ;ale dla pewnosci dodam sleepa
Next

Func end() ;zrobiłem funkcję zamykającą połaczenia i wyłączającą program dla wygody
   TCPSend($TCP, 'end')
   TCPCloseSocket($TCP)
   TCPShutdown()
   Exit
EndFunc

 

 

Serwer

 

#include <MD5.au3>
TCPStartup()

;zmienna z zhashowanym hasłem
Global Const $Haslo = "0x6ED9F5BF051E06F00C38CC8699AD6922"

;odpalanie serwera
$TCP = TCPListen('25.87.171.83', 1053)
If @error Then
   MsgBox(16, 'Błąd!', 'Nie mozna uruchomić serwera!')
   Exit
EndIf

;czekanie na klienta
Global $Socket
Do
   $Socket = TCPAccept($TCP)
Until $Socket <> -1

;czekanie na podane przez usera hasło wysłane na serwer
;umieszczam wszystko w pętli zeby serwer tez naliczał 3 próby, jakby któs udupił klienta
AdlibRegister('checkshutdown', 500)
Local $recv
For $i = 1 To 3 Step +1
   Do
       $recv = TCPRecv($Socket, 1024)
   Until $recv <> ''

   ;i sprawdzanie czy hasło sie zgadza czy nie...
   If _MD5($recv) = $Haslo Then
       TCPSend($Socket, 'tak')
   Else
       TCPSend($Socket, 'nie')
   EndIf
Next

;zamykanie wszystkiego
TCPCloseSocket($Socket)
TCPCloseSocket($TCP)
TCPShutdown()

Func checkshutdown() ;i mała funkcja która spowoduje ze serwer sie wyłaczy po dostaniu info od klienta
   If TCPRecv($Socket, 5) = 'end' Then
       TCPCloseSocket($Socket)
       TCPCloseSocket($TCP)
       TCPShutdown()
   EndIf
EndFunc

 

 

Może i za dużo bajerów, ale śmiga jak głupie po hamachi.

Hasło to

Test MD5 Klient-Serwer

846331404756772371599.jpeg
Opublikowano

 

Jest godne N00bla

Już łatwiej zdekompilować, fakt...

Ale client-server.

Client wysyła hasło niekodowane a serwer True lub False.

Do tego mechanizm z Sleep'em.

Oraz wrzucić MD5, Binary, Hex, ASCII połączone & i StringReverse.

StringReverse walnąć gdzieś pośrodku.

 

 

Istnieje coś takiego jak dbanie o czystość i klarowność kodu...

Tworzenie miliona niepotrzebnych na pewno zwiększy przejrzystość kodu :s

Opublikowano

Tworzenie miliona niepotrzebnych na pewno zwiększy przejrzystość kodu :s

Zwiększy jego przejrzystość. Przejrzystość nie zależy od długości. Gdyby zamiast zwykłego inputboxa byłoby coś bardziej skomplikowanego, to powstałaby jedna, kilkusetznakowa linijka. I to ma być przejrzystość? 20 300-znakowych linijek?

Opublikowano

 

Zwiększy jego przejrzystość. Przejrzystość nie zależy od długości. Gdyby zamiast zwykłego inputboxa byłoby coś bardziej skomplikowanego, to powstałaby jedna, kilkusetznakowa linijka. I to ma być przejrzystość? 20 300-znakowych linijek?

Idąc takim tokiem myślenia ludzie zamiast

znaki = znaki.Remove(znaki.IndexOf("abc"), znaki.LastIndexOf("def"));

pisaliby

int pP = znaki.IndexOf("abc"), dP = znaki.LastIndexOf("def");
znaki = znaki.Remove(pP, dP);

Wydłużamy w ten sposób kod, a czy naprawdę zwiększamy długość przejrzystość?

Opublikowano

Podłączając się do waszej rozmowy, czasem krótsze znaczy lepsze, wszystko zależy od sytuacji.

Ja zrobiłem tak, bo w tej sytuacji wydawało mi się że będzie bardziej przejrzyście podać tą instrukcję w paru liniach.

 

Ale w innej sytuacji, kiedy mielibyśmy inny kod, takie coś może mieć efekt zupełnie odwrotny.

Wszystko to kwestia kodu i sytuacji.

846331404756772371599.jpeg
Opublikowano

Podłączając się do waszej rozmowy, czasem krótsze znaczy lepsze, wszystko zależy od sytuacji.

Ja zrobiłem tak, bo w tej sytuacji wydawało mi się że będzie bardziej przejrzyście podać tą instrukcję w paru liniach.

 

Ale w innej sytuacji, kiedy mielibyśmy inny kod, takie coś może mieć efekt zupełnie odwrotny.

Wszystko to kwestia kodu i sytuacji.

Dokładnie

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...