Jakiego algorytmu hashowania powinienem użyć do przechowywania haseł?

Jakiego algorytmu hashowania powinienem użyć do przechowywania haseł?
0

Pytanko, bo większość tematów tego tematu ma już trochę latek, a nie wiem "co tam ostatnio złamano"

Jaki algorytm z tych jest uważany jako "bezpieczny" ?

  • MD5
  • RIPEMD160
  • SHA1
  • SHA256
  • SHA384
  • SHA512
Haskell
  • Rejestracja:ponad 9 lat
  • Ostatnio:11 miesięcy
  • Postów:4700
0

Jeżeli używasz MySQL czy MariaDB to użyj AES_ENCRYPT.


Zaglądali do kufrów, zaglądali do waliz, nie zajrzeli do d**y - tam miałem socjalizm. Czesław Miłosz
Zobacz pozostałe 2 komentarze
Shalom
Kiedyś był, nie sprawdził się.
vpiotr
Down-voty też mogą być szkodliwe, patrz SO.
nie100sowny
@vpiotr Nie siedzę, aż tak mocno na SO. Jakie negatywne skutki powoduje down vote?
vpiotr
@nie100sowny: hasło do wyguglania "what is wrong with stack overflow"
0

MSSQL + EF Core

Ktos
ASP.NET Core Identity używa PBKDF2 z HMAC-SHA256.
1

@Ktos:

Dzięki, KeyDerivation.Pbkdf2 to dobry kierunek :)

KR
pierwsza sensowna odpowiedź
Ktos
Moderator
  • Rejestracja:prawie 23 lata
  • Ostatnio:około 2 godziny
0

Tak. Z przedstawionych w pierwszym poście powiedziałbym, że żaden nie jest "najlepszym możliwym wyborem".

Stan dla roku 2018:

Argon2 is the winner of the password hashing competition and should be considered as your first choice for new applications;
PBKDF2 when FIPS certification or enterprise support on many platforms is required;
scrypt where resisting any/all hardware accelerated attacks is necessary but support isn’t.
bcrypt where PBKDF2 or scrypt support is not available.
https://www.quora.com/What-is-the-most-reliable-safe-and-efficient-password-hashing-algorithm-as-of-2018

LS
Nie żebym się czepiał ale jakbyś budował aplikację która robi coś więcej niż przechowuje słitfocie i komentarze do nich (dla państwowej instytucji, dla banków, dla czegokolwiek łenterprajs) i jako powód wybrania takiego a nie innego algorytmu haszującego podał że "wygrał" jakieś zawody to znaczyłoby że lubisz ryzyko. Skoro są jakieś standardy to lepiej trzymać się ich zaleceń niż robić za królika doświadczalnego.
0

Ok, a jakie są różnice pomiędzy HMACSHA1 HMACSHA256 HMACSHA512?

0
hauleth
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:14 dni
2

Nic z powyższych (może częściowo poza postem @Ktos). Obecnie jeśli chcesz użyć czegoś do haseł to ja bym szedł (w takiej kolejności):

  • bcrypt - "najdłużej" na rynku i dalej nie jest złamany. W przypadku algorytmów kryptograficznych wiek to zaleta.
  • Argon2id - nowy, ale wygląda na całkiem spoko
  • Argon2i - troszkę wolniejsza wersja powyższego
  • PBKDF2 - jeśli wymagasz FIPS, w przeciwnym wypadku nie ma sensu, bo powyższe są z reguły wydajniejsze i bezpieczniejsze

Na 100% nie używasz nic z poniższych:

  • Szyfrów, bo wtedy jesteś uzależniony od tego by nie wyciekł klucz. Zdecydowanie lepiej jest użyć jakąś one-way function.
  • Generycznych funkcji skrótu, zwłaszcza bez soli. Są one zwyczajnie za szybkie, bo są ograniczone tylko przez moc obliczeniową. Dodatkowo dla wielu popularnych funkcji istnieją olbrzymie tęczowe tablice.
  • MAC, bo to nie jest absolutnie ich zadanie. Oraz mają dokładnie ten sam problem z szybkością co ww. funkcje skrótu.
  • Argon2d bo jest podatny na side-channel (dostęp do pamięci bazujący na tekście jawnym, timing-attack jest możliwy)

edytowany 2x, ostatnio: hauleth
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
3

Z podanej listy: nie używać żadnego. To nie są hashe do takich celów! A bez soli to juz w ogóle.
Do hashowanie haseł bcrypt, PBKDF2, Argon2 będą ok. ABSOLUNIE nie używaj jakiegoś AESa ani innego szyfrowania! Przecież jak ci wycieknie baza to pewnie kod z kluczem też i ktoś sobie je wszystkie odszyfruje.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Haskell
  • Rejestracja:ponad 9 lat
  • Ostatnio:11 miesięcy
  • Postów:4700
0

Mam bana za to dostać? LOL, jeżeli ktoś zamyka dom i chowa klucz pod wycieraczkę, to już nie moja wina :D


Zaglądali do kufrów, zaglądali do waliz, nie zajrzeli do d**y - tam miałem socjalizm. Czesław Miłosz
hauleth
AES jest jeszcze głupszym pomysłem niż używanie ogólnych funkcji skrótu. Absolutnie nie.
lukaszek016
  • Rejestracja:około 9 lat
  • Ostatnio:ponad rok
  • Postów:249
0

Świetny temat, zupełnie z głowy mi wyleciały funkcje to haszowania haseł dedykowane do tego, nawet nie wpadłem, żeby czegoś na ten temat poszukać. Zamiast użyć np. bcrypta to stworzyłem sobie coś takiego, że do bazy zapisywany jest wynik SHA512(SHA256(sól1)+SHA256(hasło)+SHA256(sól2)) :P

edytowany 1x, ostatnio: lukaszek016
KR
nie wymyślaj - pbkdf2 jest stworzony do robienia tego co chcesz - wszystko inne zgodnie z aktualnym stanem wiedzy jest gorsze
0
lukaszek016 napisał(a):

Świetny temat, zupełnie z głowy mi wyleciały funkcje to haszowania haseł dedykowane do tego, nawet nie wpadłem, żeby czegoś na ten temat poszukać. Zamiast użyć np. bcrypta to stworzyłem sobie coś takiego, że do bazy zapisywany jest wynik SHA512(SHA256(sól1)+SHA256(hasło)+SHA256(sól2)) :P

Takie coś ma sens?

Czy to nie jest to, o czym tu piszą?

https://security.stackexchange.com/questions/25585/is-my-developers-home-brew-password-security-right-or-wrong-and-why

@Shalom

nie100sowny
jak już to SHA512(sól1 + hasło + sól2)
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

@lukaszek016 nie ma i w ogóle jest badzo bardzo bardzo słabe.

  1. SHA256(sól1) i SHA256(sól2) to STAŁE. Jak ktoś ukradnie bazę to ukradnie też te wartości. Ergo równie dobrze mogło by ich nie być...
  2. Efektywnie ktoś musi łamać jedynie SHA256(hasło), a tutaj nawet nie dodałeś soli

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Zobacz pozostałe 7 komentarzy
lukaszek016
Ok ale mówisz o sytuacji kiedy ktoś zdekompiluje mi kod. Bo skoro nie zna soli z przodu i na końcu, która jest w kodzie to na nic mu tablice teczowe. No chyba ze ustawi sobie hasło 1234 i porówna hashe ale to i tak albo musi zdekompilowac program albo ukraść bazę po tym jak założy sobie konto z takim hasłem.
Shalom
@lukaszek016: jak ktoś ci dumpuje bazę to aplikację pewnie też wyciągnie, a zdekompilowanie to pikuś, szczególnie jak to jakiś python, java czy c# ;]
jarekr000000
Generalnie teoretyczna kryptogtografia zaczyna się od założenia, że kod jest znany (często jest to nawet wymagane) - bo to pesymistyczny przypadek, który należy zakładać (i umożliwia policzenie ile przynajmniej mocy obliczniowej należy użyć do np odwrócenia hasła. Obscurity trudno użyć do wzoru i wyszacować :-) W praktyce UMIEJĘTNE obscurity może dodatkowo pomóc, ale musi być UMIEJĘTNE (łatwo sobie zrobić strzał w stopę).
lukaszek016
Dzięki za cenne informacje ;) faktycznie zaimplementowalem takiego raka na początku aplikacji a później już na to uwagi nie zwracałem. Cóż zmienię na bcrypt.
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:około godziny
  • Postów:2367
0

Podepnę się pod wątek i zadam pytanie dodatkowe: jak generować dobry salt? :)

Co sądzicie o:

  1. Operator uruchamia aplikację i podaje hasło do jakiegoś składziku tajnych rzeczy
  2. Aplikacja otwiera "składzik" korzystając z hasła podanego przez operatora
  3. Aplikacja odczytuje sekretny token o nazwie token1
  4. Aplikacja stara się "zapomnieć" hasło do składzika
  5. Aplikacja generuje salt jako funkcję (login, password, sekretny token)
  6. Aplikacja dla użytkownika generuje hasza "salt + password " i zapisuje, ze wykorzystano token o nazwie token1

Słaby punkt: token1 jest w pamięci.

MarekR22
to wskazuje na to, że nie rozumiesz po co jest sól. Ona wcale nie ma być tajemnicą, ma jedynie pomieszać właściwości funkcji hashującej, by zwiększyć entropię hash-y wszystkich haseł.
YA
@MarekR22: chodziło o sól w kontekście ataku na zaszyfrowane hasło, w którym oprócz bazy wycieka kod, tudzież binarka, które to elementy mogą zostać poddane analizie. Po co? Może część użytkowników ma to samo hasło również do skrzynki pocztowej. Maila pewnie zapisany w bazie obok salta ;-)
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:7 minut
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1

Nie widzę isyotnej przewagi nad zwykłym generowanym saltem.
Salt zależny od hasła to natomiast na pewno słaby punkt
Jesli masz naprawdęsekretny bezpieczny składzik na te tokeny, to oszczędź sobie pracy i zamiast tokenów trzymaj w składziku hasła/(hashe). Profit. :)
Jeśli wyjęty token1 będzie użyty więcej niż raz to możesz roboczo przyjąć, że nie masz soli/jest stała. Czyli kiepsko.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 6x, ostatnio: jarekr000000
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:około godziny
  • Postów:2367
0
jarekr000000 napisał(a):

Nie widzę isyotnej przewagi nad zwykłym generowanym saltem.

Istotna różnica, to to, że taki salt nie byłby zapisywany w bazie razem z hasłem, tylko liczony z tego co poda user + magic value.

Salt zależny od hasła to natomiast na pewno słaby punkt

Jeśli oparty tylko o hasło, to pewnie tak.

Jesli masz naprawdęsekretny bezpieczny składzik na te tokeny, to oszczędź sobie pracy i zamiast tokenów trzymaj w składziku hasła/(hashe). Profit. :)

Jeśli byłby skalowalny, to czemu nie :D Ale miałem na myśli coś typu javowy keystore. Pomijam kwestie wygody i utrzymywania tego ;)

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:7 minut
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0

Powiedzmy dokładniej : napisz jak robisz funkcję (login, password, sekretny token), a zobaczymy jak to atakować...


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 22 godziny
  • Postów:5108
0
yarel napisał(a):

Słaby punkt: token1 jest w pamięci.

A przypadkiem jeżeli ktoś ma dostęp do pamięci, to nie masz większych problemów? :P

jarekr000000 napisał(a):

Powiedzmy dokładniej : napisz jak robisz funkcję (login, password, sekretny token), a zobaczymy jak to atakować...

"Wszyscy" robią w ten sposób:

https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/consumer-apis/password-hashing?view=aspnetcore-2.1

https://www.c-sharpcorner.com/article/hashing-in-asp-net-core-2-0/

https://tahirnaushad.com/2017/09/09/hashing-in-asp-net-core-2-0/

Czyli KeyDerivation.Pbkdf2 + HMACSHAXXX

Kopiuj
byte[] salt = new byte[128 / 8];

new RNGCryptoServiceProvider().GetBytes(salt);

// derive a 256-bit subkey (use HMACSHA1 with 10,000 iterations)
string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
	password: password,
	salt: salt,
	prf: KeyDerivationPrf.HMACSHA1,
	iterationCount: 10000,
	numBytesRequested: 256 / 8));

Atakuj :P

edytowany 9x, ostatnio: WeiXiao
Zobacz pozostałe 3 komentarze
jarekr000000
Czasem pisze. I zwykle juz po miesiącu dowiaduje się, że jest bardzo słabe (na szczęście nie przez włamy tylko, przez doczytanie). Ale na szczęście na żadnej produkcji nie mam swojego security.
jarekr000000
Wskazówka, w dobie OAUTH Twiterowego, googlowego czy FB możesz w prostych serwisach problem olać i zrzucić go na profesjonalistów. Polecam.
WeiXiao
@jarekr000000: prostytutka, faktycznie :D
WeiXiao
@jarekr000000: ale z drugiej strony jeszcze nie widziałem serwisu, który byłby w 100% na logowaniu via 3rd.
YA
@WeiXiao: tak, jeśli jest dostęp do pamięci, to wtedy problem jest zdecydowanie większy :D
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:7 minut
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0
WeiXiao napisał(a):

Słaby punkt: token1 jest w pamięci.

A przypadkiem jeżeli ktoś ma dostęp do pamięci, to nie masz większych problemów? :P

To jest akurat istotny punkt. Przez swap lub jakiś dump można często wymusic zrzut pamięci. Tak się projektuje algorytmy, aby zminimalizowac szkody takiego ataku (hasło jak najkrócej w pamięci). Dlatego np. w javie wszelkie funkcje od security chodzą na tablicy bajtów, a nie na stringach. Tablice bajtów możesz szybko wyczyścić po użyciu (i powinieneś). String (immutable) może się z różnych powodów długo po pamęci panoszyć.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 4x, ostatnio: jarekr000000
jarekr000000
ale właśnie sobie tak pomysłałem, że przeciez JVM jest taki cudowny i ma kompaktujące GC i ciekawe jak to wpływa na bezpieczeństwo. my tu sobie zerujemy tablicę bajtów, a w międzyczasie poprzednia kopia zostaje gdzieś na nieużywanej pamięci. Widać problem, ale nie znalazłem ciekawego artykułu na ten temat - może nie umiem szukać. Możliwe, że mam ciekawy temat na JCrete
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:około godziny
  • Postów:2367
0
jarekr000000 napisał(a):

Powiedzmy dokładniej : napisz jak robisz funkcję (login, password, sekretny token), a zobaczymy jak to atakować...

Nie robię :P Ale gdybym robił to pewnie w coś w ten deseń:

Kopiuj
Token[0..255] - wartości od 00..FF  
salt = Token[ password[i] ] + Token[ login[j]  ]
albo 
salt = HASZ(Token[ password[i] ] + Token[ login[j] ])

gdzie i,j przebiegają odpowiednio: i=0..len(password)-1, j=0..len(login)-1

Ewentualnie inna długość tokena i mod 256 w indeksowaniu.

jarekr000000
Czy to jest tak, że tabela token to po prostu klucz do podstawienia każdej litery loginu i hasła na inną. Taki szyfr podstawieniowy?
YA
Tak. Nazwanie rzeczy po imieniu uświadomiło mi jak słaba jest powyższa funkcja. Oraclowy wrapper pl/sqla opiera się o coś podobnego, a ten "sekretny token" łatwo się wyciąga...
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
1

Mając w pamięci ten wątek znalazłem filmik o różnicy m. szyfrowaniem a hashowaniem - wersja dla opornych:

WeiXiao
Oczywiście każda iteracja (cost) wpływa na hash, czyli f(password, salt, 1) != f(password, salt, 25557) ta?
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:7 minut
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1
yarel napisał(a):
Kopiuj
Token[0..255] - wartości od 00..FF  
salt = Token[ password[i] ] + Token[ login[j]  ]
albo 
salt = HASZ(Token[ password[i] ] + Token[ login[j] ])

gdzie i,j przebiegają odpowiednio: i=0..len(password)-1, j=0..len(login)-1

Ewentualnie inna długość tokena i mod 256 w indeksowaniu.

Krótko, nie ma problemu z tym, że ten robisz tam proste podstawienie itp. (see nasze komentarze pod postem).
Technicznie i tak założenie jest, że tokeny udaje się zdobyć (bo znowu jeśli umiesz bezpiecznie przechować tokeny to czemu w ten sam sposób nie przechować hashy do hasel :-)).

Więc zakładamy, że wszystko wycieka - atakujący ma algorytm , hashe i te tokeny.

Problem jest, że powstaje ciekawa właściwość
Konta (z hasłami):
arel / qwerty (oczywiście słabe hasło)
yarel / qwert (dużo mniej oczywiste... )

będą miały tą samą sól i będzie można zgadywąć po loginach, gdzie takie szanse są możliwe.

Dramatu nie ma od razu - bo masz różne hasła i hash wyjdzie inny.

Nie mam też pojecia w tej chili pojęcia jak to zaatakować, ale tego typu własności zwykle się mszczą. I z tego co wiem, jest to po prostu słabsze rozwiązanie niż po prostu losowa i zapisana nawet w bazie sól.

EDIT: Już wiem.
Trzeba się było piwka napić, żeby znaleźć dlaczego ten pomysł z saltem zależnym od hasła to naprawdę zły pomysł.
Jeśli sól to funkcja postaci salt = Token[ password[i] ] + Token[ login[j] ] (czy w zasadzie jakakolwiek, gdzie hasło jest inputem, jednym z inputów).
To: albo nie zapisujemy tego salta w bazie, bo przecież chcemy być secure... ale jak wtedy zweryfikowac czy ktoś podał dobre hasło przy logowaniu....? trzeba by mieć plain text tego hasła... Czyli słabo. Inaczej nie odtworzymy soli (nie mając plain textu hasła ) i nie możemy zweryfikować nikogo przy logowaniu. Słaby to system.

W takim razie, jednak wynik takiej funkcji salt - musimy zapisać. Ale wtedy zamiast odwracać hash żeby zgadnąć hasło, to mamy dużo prostszą metodę ataku przez to, że mamy zapisane jak wygląda salt ( który też zależy od hasła !).
W najgorszym razie sprowadza się to przypadku, jakby po prostu nie było soli (w przypadku jeśli : salt = HASZ(Token[ password[i] ] + Token[ login[j] ])).i8


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 10x, ostatnio: jarekr000000
KM
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:473
0

Czy to, co tu piszą, ma sens?

https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords

Wnoszę że ma, po fakcie że jest to 3. najwyżej zupvoteovane pytanie na tej stronie. Więc gdyby nie było, ktoś by się już zorientował

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)