Dlaczego tak wiele zaszyfrowanych i zaszyfrowanych ciągów kończy się znakiem równości?

64

Pracuję w C # i MSSQL i, jak można się spodziewać, przechowuję moje hasła solone i mieszane.

Kiedy patrzę na hash przechowywany w kolumnie nvarchar (na przykład out of box dostawca członkostwa aspnet). Zawsze byłem ciekawy, dlaczego generowane wartości Salt i Hash zawsze wydają się kończyć jednym lub dwoma znakami równości.

Widziałem podobne rzeczy podczas pracy z algorytmami szyfrowania, czy to przypadek, czy jest tego powód?

Liath
źródło
19
Nawiasem mówiąc, jeśli przechowujesz dane binarne zakodowane w standardzie Base64 w polu NVARCHAR, płaczę nad twoimi 6-krotnymi odpadami pamięci! Po pierwsze, Base64 może zawierać tylko 64 znaki w dolnej połowie ASCII (więc potrzebujesz tylko VARCHAR, aby zapisać połowę). W przypadku dwóch, Base64 rozbija każdy bajt danych na 1-4 znaki. SQL Server ma już typ VARBINARY, który jest całkiem zdolny do przechowywania skrótów bez wzdęć spowodowanych kodowaniem i nie dba o sortowanie w swoich porównaniach ... :-)
jimbobmcgee
3
@WillieWheeler, skrót musi być jakoś zapisany. Base64 może nie być idealnym nośnikiem pamięci, ale nie ma w tym nic złego. Jeśli hash("my password")tworzy tablicę [1,2,3,4,5]i muszę przechowywać te wartości w bazie danych, istnieją gorsze możliwości niż przechowywanie łańcucha AQIDBAU=(Oczywiście, jeśli używana funkcja haszująca już wytwarza łańcuch, wydaje się trochę głupie, aby kodowanie w Base64 było trochę niemądre. )
Brian S
2
@WillieWheeler Myślę, że brakuje ci sensu. Ponownie przeczytaj to, co napisał Brian S. - nie mówił o właściwościach base64 do mieszania - to absurdalne base64 nie jest algorytmem mieszającym. Mówi, że nie ma nic złego w przechowywaniu skrótu (utworzonego przez funkcję / algorytm skrótu) w formie base64.
Andrew Savinykh
3
OP twierdzi, że przechowuje skrót i kończy się znakiem równości. To sugeruje, że myli hashowanie z kodowaniem Base64. Jeśli chodzi o to, że kodowanie base64 jest w porządku, to oczywiście, ale co to ma z tym wspólnego?
Willie Wheeler,
2
Tak, w końcu zrozumiałem, co się dzieje. Przejrzałem moje pliki kluczy publicznych i prywatnych SSH i zauważyłem, że mają one również końcówki = / ==. Są to kodowania base64 tablic bajtów, jak opisują BrianS i zespri. Dzięki chłopaki.
Willie Wheeler,

Odpowiedzi:

95

Te zaszyfrowane ciągi są (zwykle?) Kodowane w formacie Base64, a znak równości służy do uzupełniania ciągu, aby długość (liczba bajtów) była podzielna przez trzy. Wikipedia dość dobrze to wyjaśnia: http://en.wikipedia.org/wiki/Base64 .

svenslaggare
źródło
36

Czy może to być padding kodujący Base 64?

Sekwencja „==” wskazuje, że ostatnia grupa zawierała tylko jeden bajt, a „=” oznacza, że ​​zawiera dwa bajty. Poniższy przykład ilustruje, w jaki sposób obcięcie wejścia całego powyższego cytatu zmienia wypełnienie wyjściowe:

http://en.wikipedia.org/wiki/Base64#Output_padding

Jaydee
źródło