\section{Hash}

\begin{frame}{Mi az a hash?}
  \begin{block}{Definíció}
    Tetszőleges hosszúságú bemenetet rögzített méretű lenyomattá alakít.
  \end{block}
  
  \begin{itemize}
    \item Egyirányű függvény (nem visszafejthető)
    \item Gyorsan számolható
    \item Kis változás teljesen más hasht eredményez
  \end{itemize}
  
  \begin{alertblock}{Fontos}
    Hash $\neq$ titkosítás: nem visszafejthető!
  \end{alertblock}
\end{frame}

\begin{frame}{Hash tulajdonságok}
  \begin{itemize}
    \item \textbf{Deterministic}: azonos bemenet = azonos kimenet
    \item \textbf{Preimage resistance}: nehéz visszafejteni
    \item \textbf{Second preimage}: nehéz másik bemenetet találni
    \item \textbf{Collision resistance}: nehéz két különböző bemenetet találni azonos hash-sel
  \end{itemize}
  
  \begin{exampleblock}{Példa}
    \texttt{hash("jelszo") = 5f4dcc3b5aa765d61d8327deb882cf99}
  \end{exampleblock}
\end{frame}

\begin{frame}{Gyenge vs. erős hash}
  \begin{columns}
    \begin{column}{0.48\textwidth}
      \begin{block}{Gyenge hash}
        \begin{itemize}
          \item MD5, SHA1 (elavult)
          \item Gyors → brute force könnyebb
          \item Ütközések ismertek
        \end{itemize}
      \end{block}
    \end{column}
    
    \begin{column}{0.48\textwidth}
      \begin{block}{Erős hash}
        \begin{itemize}
          \item bcrypt, Argon2, scrypt
          \item Lassú, konfigurálható
          \item Salt + work factor támogatás
        \end{itemize}
      \end{block}
    \end{column}
  \end{columns}
  
  \vspace{0.4cm}
  
  \begin{alertblock}{Jelszavakhoz}
    Soha ne használj általános hash-t (MD5, SHA1) jelszavak tárolásához!
  \end{alertblock}
\end{frame}

\begin{frame}{Salt és Pepper}
  \begin{block}{Miért fontos?}
    \textbf{Salt:} véletlen érték, amit a jelszóhoz adunk hash előtt.
  \end{block}
  
  \begin{itemize}
    \item Védelem rainbow table ellen
    \item Minden jelszónál egyedi salt
    \item Salt-et tárolhatjuk adatbázisban
  \end{itemize}
  
  \begin{exampleblock}{Pepper}
    Közös titkos kulcs, szerver konfigban tárolva.
  \end{exampleblock}
\end{frame}

\begin{frame}{Password hashing algoritmusok}
  \begin{itemize}
    \item \textbf{bcrypt}
      \begin{itemize}
        \item Beépített salt és work factor

      \end{itemize}
    \item \textbf{scrypt}
      \begin{itemize}
        \item Memória-igényes → GPU támadások ellen jobb
      \end{itemize}
    \item \textbf{Argon2}
      \begin{itemize}
        \item Modern szabvány (PHC winner)
        \item Paraméterezhető (time, memory, parallelism)
      \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}[fragile,shrink=10]{bcrypt használat (Node.js)}
  \begin{exampleblock}{Hash készítés}
    \tiny
    \begin{verbatim}
const bcrypt = require('bcrypt');
const saltRounds = 12;

const hashPassword = async (password) => {
  const salt = await bcrypt.genSalt(saltRounds);
  return bcrypt.hash(password, salt);
};
    \end{verbatim}
  \end{exampleblock}
  
  \begin{exampleblock}{Ellenőrzés}
    \tiny
    \begin{verbatim}
const isValid = await bcrypt.compare(password, storedHash);
    \end{verbatim}
  \end{exampleblock}
\end{frame}

\begin{frame}{Hash-elés felhasználása}
  \begin{itemize}
    \item Jelszó tárolás
    \item Fájl integritás ellenőrzés
    \item Digitális aláírások
    \item Cache kulcsok
  \end{itemize}
  
  \begin{alertblock}{Megjegyzés}
    Authentikációban: jelszó soha ne legyen visszaolvasható.
  \end{alertblock}
\end{frame}

\begin{frame}{Hash Best Practices}
  \begin{itemize}
    \item Jelszhoz \textbf{bcrypt/Argon2/scrypt}
    \item Egyedi salt minden jelszóhoz
    \item Work factor beállítása (pl. bcrypt 10-12)
    \item Soha ne plain text
    \item Rate limiting + lockout
  \end{itemize}
\end{frame}

\begin{frame}{Összefoglalás - Hash}
  \begin{itemize}
    \item Hash = egyirányú lenyomat
    \item Jelszavakhoz speciális algoritmus kell
    \item Salt és pepper növeli a biztonságot
    \item Argon2 a legajánlottabb modern választás
    \item Hash nem titkosítás!
  \end{itemize}
  
  \vspace{0.5cm}
  
\end{frame}