Przepis na bezpieczniejsze hasła

Piotr Przybył
piotr@przybyl.org
4Developers 2016

Hasła w czystym tekście

mydelniczka więzienie

Hasła "zaszyfowane"

  • "nieodwracalnie" (a.k.a. "zahaszowane")
  • odwracalnie

Na wypadek kradzieży lub sprzedaży danych:

keep it secret, keep it safe

Hasło zahaszowane, ver. 1


  Column  |  Type  | Modifiers
 ---------+--------+-----------
 password |  int   | not null
						

							class UserDao
						

							void insertUser(String login, String password)
						

							session.createQuery(...);
						

							password.hashCode();
						

Dlaczego?

Hasło zahaszowane, ver. 1

hashCode, bo hasła muszą być "zahaszowane"

Y U NO RTFM?

Hasło zahaszowane, ver. 1


/**
 * Returns a hash code value for the object. This method is
 * supported for the benefit of hash tables such as those provided by
 * {@link java.util.HashMap}.
 ...
 */
 public native int hashCode();
						

Hasło zahaszowane, ver. 1


public int hashCode() {
	int h = hash;
	if (h == 0 && value.length > 0) {
		char val[] = value;

		for (int i = 0; i < value.length; i++) {
			h = 31 * h + val[i];
		}
		hash = h;
	}
	return h;
}
						

AbCdEf, BBcEFG, AbCcdf, AbDDdf, BBbcdf, BCCdEf,
BCDDeG, BCDEEf, BCDEFG, AbCdFG, AbDEFG, BCCceG
						

Hasło zahaszowane, ver. 2


UPDATE `admin_user` SET `password` = MD5('anyword')
WHERE `admin_user`.`user_id`= 1;
						

Wersja CE


public function hash($data) {return md5($data);}
							

Wersja EE


public function hash($data, $version = self::HASH_VERSION_LATEST) {
  if (self::HASH_VERSION_MD5 === $version) {
    return md5($data);
  }
  return hash('sha256', $data);
}
							

Hasło zahaszowane, ver. 2

Y U NO RTFM? man md5sum | grep -A3 ^BUGS

Hasło zahaszowane, ver. X

  • Brute force
  • Hash tables

Rainbow tables

salt shaker

Hasło ver. salt+hash

Our password hashing has no clothes / Troy Hunt

Hasło ver. salt+hash

MD5 ~4,7 mld/s
SHA1 ~2,2 mld/s
hasło 6 znaków BF (~57 mld kombinacji) < 60s
Eksperyment: 45 min. 25k/40k (~63%)

~9,25 hasła na sekundę

Hasło ver. salt+hash

BITCOIN mine

Hasło ver. salt+hash

cloud

W czym tkwi problem

speed limit

Czy mnie to dotyczy?

wyciek wyciek wyciek wyciek wyciek wyciek

Co robić?

Rozciągać!

Hasło ver. rozciągliwa

  • PBKDF2 (Password-Based Key Derivation Function 2)
  • bcrypt
  • scrypt
  • Password Hashing Competition (Argon2, etc.)

Hasło ver. rozciągliwa

asafaweb

Thanks Troy!

Jak zrobić?

  1. ADD COLUMN passwd_new_hash
  2. ADD COLUMN only_crypt default false
  3. SET passwd_new_hash = crypt(passwd_hash)
  4. Po udanym logowaniu
    • SET passwd_new_hash = crypt(plain_passwd)
    • SET only_crypt = true
  5. RENAME COLUMN passwd_hash TO stale_old_passwd_hash
  6. Poczekać i sprawdzić czy działa.
  7. DROP COLUMN stale_old_passwd_hash
  8. Po zmianie wszystkich haseł DROP COLUMN only_crypt

So... use bcrypt, use bcrypt, use bcrypt, use bcrypt?

Nie zawsze. I rób to mądrze.

  • Nie implementuj samodzielnie.
  • Dobierz odpowiedni koszt.
  • Zawsze unikalna sól.
  • Czasem nie ma implementacji (Linux crypt).
  • Czasem błędy w implementacji - PHP: 2a, 2x, 2y.
  • Pamiętaj o scrypt, PHC i innych.

So... use bcrypt, use bcrypt, use bcrypt, use bcrypt?

  • Zastanów się nad zewnętrznym dostawcą autentykacji.

Algorytm to za mało

czyli

PICNIC

Problem in chair, not in computer.

Najpopularniejsze hasła 2015

  1. 123456 (Unchanged)
  2. password (Unchanged)
  3. 12345678 (Up 1)
  4. qwerty (Up 1)
  5. 12345 (Down 2)
  6. 123456789 (Unchanged)
  7. football (Up 3)
  8. 1234 (Down 1)
  9. 1234567 (Up 2)
  10. baseball (Down 2)
  11. welcome (New)
  12. 1234567890 (New)

The 25 Most Popular Passwords of 2015: We're All Such Idiots

Co znalazł Troy?

  • 93% - 6 do 10 znaków
  • 45% - tylko małe litery
  • 36% - zwykły słownik
  • 67% - wykorzystane ponownie (Gawker)
  • 1% - ze znakiem niealfanumerycznym

Jakie hasła?

  • Hasła długie.
  • Bogate "alfabety".
  • Hasła unikalne dla strony.
  • Generowane?

Co jeszcze?

  • Wysyłanie e-mailem.
  • Logi.
  • String vs. char[]
  • /dev/urandom | javax.crypto.SecureRandom
  • seed()
  • HTTPS
    Cipher suite

Hasło maskowane

Implementacja możliwa bez:

  • czystego tekstu,
  • przechowywania każdej kombinacji,
  • szyfrowania symetrycznego.

Partial Passwords / Smart architects

Czy teraz moje hasła są bezpieczne?

Warto przeczytać i źródła

http://www.troyhunt.com/2012/06/our-password-hashing-has-no-clothes.html
https://adambard.com/blog/3-wrong-ways-to-store-a-password/
https://password-hashing.net/
https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016
http://gizmodo.com/the-25-most-popular-passwords-of-2015-were-all-such-id-1753591514
http://krzysztofjelonek.net/hasla-maskowane-bledy-implementacyjne-polskiego-banku/
http://www.smartarchitects.co.uk/news/9/15/Partial-Passwords---How.html
https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

http://www.theregister.co.uk/2016/02/08/alibaba_taobao_security_process_failure/
http://www.pcworld.com/article/226128/Sony_Makes_it_Official_PlayStation_Network_Hacked.html
http://arstechnica.com/security/2015/08/ashley-madison-hack-is-not-only-real-its-worse-than-we-thought/
http://www.kongsli.net/2010/04/14/atlassian-products-hacked/
http://www.omgubuntu.co.uk/2013/07/ubuntu-forum-hacked-users-advised-to-change-passwords
http://www.zdnet.com/article/6-46-million-linkedin-passwords-leaked-online/
http://allegro.pl/asus-hd-7970-3gb-ddr5-gwar-fv-i4937839839.html
https://www.cyberguerrilla.org/a/2013/?p=13523
https://twitter.com/paweljonca/status/715895678950572032

Przepis na bezpieczniejsze hasła


Dziękuję za uwagę

i udanego rozciągania

Piotr Przybył
piotr@przybyl.org
4Developers 2016
przybyl.org/pres/4Developers2016

qr