Linux - szyfrowanie hasła

0

Witam!!!
Na wstępie chciałbym zaznaczyc ze ten post bedzie wykorzystany jedynie w celach edukacyjnych autora , czyli mnie. Tak więc jesli ktos wie jak wyglada szyfrowanie hasła w linuchu. Chodzi mi o to ze jak to moze dzialac tylko w jedna strone. Przeciez jak istnieje jakis algorytm kodowania to analogicznie jest algorytm dekodacji. Jak wiadomo sprawdzanie wpisanego hasla z zaszyfrowanym działa nastepujaco(algorytm):
1.Pobierz tekst
2.zakoduj
3.porownaj z zakodowanym
4.jesli sie nie zgadza to wroc do 1.
5.Jesli sie zgadza to idz dalej.
Lecz to nie jest tematem moich rozwazan. Chodzi mi o to jak to mozliwe ze kodowanie to jest jednostronne. [hurra]

0

Kodowanie jednostronne:

  1. Wprowadzenie hasla: system pobiera haslo, koduje i zapisuje
  2. Logowanie: system pobiera haslo, koduje i porownuje z zapamietanym (rowniez zakodowanym).
    Dzieki temu nawet administrator nie moze (teoretycznie) odczytac hasel uzytkownikow.
    Taka metoda jest stosowana w kontach bankowych.

No i jak to jest mozliwe:

s := 'pascal';
for i := 1 to length(s) do s[i] := chr((ord(s[length(s)+1-i])+ord(s[i mod 2 + 1])) div 2);

Otrzymany wynik kodowania to: fccdcf
Otrzymanego hasla zakodowanego raczej nie da sie zdekodowac
Mam nadzieje ze sie nie pomylilem, jesli tak to prosze mnie poprawic

0

Takie cos nazywa sie hashowanie
I jedyna chyba pewna metoda jest zrobienie sobie slowniczka takich hashow hasel i porownywanie z zahashowanym haslem.
Ale zrobienie slowniczka dla metody 'wszystkie kombinacje'(a'la BruteForce) to dysku na slownik nie starczy, nie mowiac juz o czasie poswieconym na wygenerowanie slownika.
Tak ze hashowanie to jest ql metoda :)

0

Tego się nie da rozszyfrować nawet za pomocą spisu wszystkich hashow. Dajmy na tapetę taką metodę szyfrowania:

var
haslo:string;
hash, i:integer;

hash:=0;
haslo:='AB';
for i:=1 to length(haslo) do
hash:=hash+ord(haslo[i]);

A - 65 (chyba) ASCII
B - 66 ASCII

Czyli hash wyjdzie 131. co będzie, gdy hasłem będzie 'BA'? Nic się nie zmieni. Dalej hash będzie 131. Tak więc nie da się jednoznacznie stwierdzić, jakie było hasło, z którego powstał ten hash. I oczywiście to nie jedyne możliwości powstania takiego hashu, można jeszcze mieć np. ciąg składający się z liter o kodach 67 i 64, itd.

0

Czyli w linuksie da sie wpisac takie haslo ktorego hash bylby rowny iles tam i wcale to nie musialo by byc to prawdziwe haslo. Czyz nie? Ale wyciag z pliku z haslami troche inaczej wyglada

0

zauwaz jeszcze rus3k ze tu podane hashowanie jest tylko przykladaowe, a wiec w linuxie stosowane jest chyba nieco inne(ale dzialajace na podobnej zasadzie) i o wiele dluzsze/trudniejsze

0

man 3 crypt

CRYPT(3) Funkcje biblioteczne CRYPT(3)

NAZWA
crypt - szyfrowanie danych i haseł

STRESZCZENIE
#define _XOPEN_SOURCE
#include <unistd.h>

   char *crypt(const char *key, const char *salt);

OPIS
crypt to funkcja szyfrująca hasła. Opiera się ona na algorytmie Data Encryption Standard, z pewnymi modyfikacjami mającymi (między innymi) zapobiec próbom sprzętowego złamania klucza.
Argument key to hasło wpisane przez użytkownika, a salt to łańcuch dwóch znaków z zestawu [a-zA-Z0-9./]. Ten łańcuch umożliwia kodowanie jednego hasła na 4096 różnych sposobów.
Poprzez pobranie pierwszych 7 bitów każdego znaku łańcucha key tworzony jest 56-bitowy klucz. Ten klucz jest używany do zakodowania z góry ustalonego łańucha znaków (zwykle jest to łańcuch składający się z samych zer). Zwracana wartość wskazuje na zaszyfrowane hasło, serię 13 znaków ASCII (pierwsze dwa znaki reprezentują argument salt). Zwracana wartość wskazuje na statyczną daną, która jest nadpisywana przy każdym wywołaniu funkcji.
Uwaga: Istnieje 2**56 , czyli 7.2e16, możliwych wartości. Możliwe jest przeszukiwanie przestrzeni klucza z użyciem kom­puterów z przetwarzaniem równoległym. Dostępne są programy, takie jak crack (1), przeszukujące obszar kluczy które są często wykorzystywany przez ludzi jako hasła. Tak wieć hasło nie powinno zawierać powszechnych wyrazów i nazw. Zalecane jest używanie programu passwd (1), który sprawdza, czy hasło nie jest słabe podczas jego zmiany lub wyboru.
Sam algorytm DES ma kilka wad, dlatego crypt() jest złym rozwiązaniem zastosowań innych niż sprawdzanie hasła. Jeśli planujesz wykorzystać crypt() dla celów kryptograficznych, nie rób tego. Zdobądź dobrą książkę o szyfrowaniu i jedną z ogólnodostępnych bibliotek DES.

ZGODNOŚĆ Z
SVID, X/OPEN, BSD 4.3

PATRZ TAKŻE
login(1), passwd(1), encrypt(3), getpass(3), passwd(5)

                     Wrzesień 3, 1994                CRYPT(3)
0

Witam.

Od razu muszę przeprosić - temat jest bardzo ciekawy i zasługuje na kilka godzin rozmyślań i przewracania książek ale ponieważ jestem w środku sesji egzaminacyjnej mogę mu poświęcić co najwyżej kilka minut.

Zacznijmy od jednej kwesti:

Przeciez jak istnieje jakis algorytm kodowania to analogicznie jest algorytm dekodacji.

Otóż nie!

Zapomnijmy na chwilę o wszystkim co wiemy na temat kryptografii. Będzie nas interesować reszta z dzielenia całkowitego. Formalny zapis tego działania to: x (mod a) [czytaj "x modulo a"] co oznacza resztę z dzielenia x przez a. Wynik jest liczbą nieujemną mniejszą od a.

Zobaczmy czy się rozumiemy:
12 (mod 10) = 2

  • 5 (mod 3) = 1

Wracamy do kryptografii. Niech komunikat (który chcemy zakodować) będzie liczbą całkowitą oraz niech funkcja kodująca ma postać:

kod = komunikat (mod 10)

Istnieje więc precyzyjnie określony algorytm kodowania, natomiast nie istnieje metoda odwrócenia tego procesu gdyż kod="7" może odpowiadać nieskończonej liczbie oryginalnych komunikatów (w tym np. "17", "451347","7").

Podsumowując odpowiedzmy na pytanie, czym jest kodowanie z punktu widzenia matematyki ? Kodowanie jest funkcją:
f: komunikat -> kod

Algorytm dekodujący jest oczywiście funkcją odwrotną. Z matematyki wiemy że funkcja taka istnieje wtedy, gdy funkcja pierwotna jest różnowartościowa.

Wniosek jest oczywisty: Algorytm kodujący posiada algorytm dekodujący wtedy gdy funkcja kodująca jest różnowartościowa.

[ to jest oczywiście ujęcie bardzo formalne i matematyczne, w praktyce jeżeli funkcja jest "różnowartościowa nie do końca" tak jak w przypadku kodowania DES gdzie jedna wartość klucza może odpowiadać maksymalnie 2^56 różnym komunikatom pierwotnym, wtedy można się pokusić o wypisanie wszystkich (wstępnie przefiltrowanych) możliwości ]

Kwestia druga:
Pojawił się (w mojej opini niesłusznie) temat haszowania. Funkcja kodująca jednostronnie jest tworzona w taki sposób, aby była (w rozsądnych granicach) jak najmniej różnowartościowa (co utrudnia rozkodowanie - patrz wyżej). Zupełnie odwrotnym celom służy funkcja haszująca, która powinna być jak najbardziej różnowartościowa. Dlaczego ?

Funkcja haszująca jest funkcją typu:
h: obiekt (klucz) -> liczba

Liczba będąca wynikiem działania tej funkcji służy (w 90% zastosowań) jako indeks w tablicy (tablicy haszującej).

Idea jest naprawdę prosta: Wkładanie elementu do tablicy haszującej jest realizowane przez funkcję pobierającą dwa argumenty:
put (klucz, obiekt).

Klucz jest dowolnym obiektem, np. napisem, który jest następnie przekształcany w liczbę za pomocą funkcji haszującej (liczba ta odpowiada indeksowi pod którym obiekt jest przechowywany)

Wyjmowanie elementów jest natomiast realizowane za pomocą metody:
get (klucz)

Aby uniknąć konfliktów, funkcja haszująca powinna być (w rozsądnych granicach) różnowartościowa.

Pozdrawiam

0

Pytanie poza tematem: Czy da sie utworzc klucz 1024 bit'owy?

0

Pytanie poza tematem: Czy da sie utworzc klucz 1024 bit'owy?

Krotko i na temat: TAK.

0

a jak wielki da sie osiagnac

0

2^ileśtam. ja osobiście spotkałem się z max 2048, ale na 100% są wieksze

0

A moze ma ktos jakis slownik do rozkodowywania pliku z haslami (ja rozkodowuje Johny the ripper)
p.s. Jakis duzy ja mam 15 mb

0

zamieszczam krypto reklamę ;-)
w dziale Delphi-->Kody źródłowe jest hasłownik (autor zbyszek4u)
całkiem dobry program do robienia słowników (z plików txt)
na 100% działa (byłem beta testerem ;-)
Więc weź kilkanaście (tysięcy ;-) plików txt i sobie słownik wygeneruj ;-P

1 użytkowników online, w tym zalogowanych: 0, gości: 1