Kategorie
java

SHA-256 Java, czyli bezpieczny skrót

Kontynuując zabawę z funkcjami skrótu, tym razem wybór padł na SHA-256 w Java.

Junior Java Developer Handbook

Co to jest SHA-256?

SHA-256 to tak naprawdę jeden z sześciu algorytmów z rodziny jednokierunkowych funkcji skrótu Secure Hash Algorithm 2 (SHA-2). W skład całej rodziny wchodzą następujące warianty SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256.

W uproszczeniu jest to algorytm, który wylicza 256 skrót (zestaw 256 bitów) dla dowolnego ciągu danych. Przy okazji artykułu MD5 w Java w sekcji Co to jest MD5? pisałem o wymogach, jakie funkcja skrótu musi spełniać.

Jeżeli zastanawiasz się, gdzie na co dzień możesz spotkać SHA-256, to popatrz na kłódeczkę w adresie bloga lub innych stron, np. google.pl. Jeśli w nią klikniesz i przejdziesz do szczegółów certyfikatu to prawie na pewno zobaczysz tam taki wpis:

Algorytm wyznaczania wartości skrótu podpisu: sha256

Podobnie na wielu stronach z oprogramowaniem możesz obok linku z konkretnym plikiem znaleźć jego skrót SHA-256. Jak również ma on zastosowanie w większości kryptowalut, np. Bitcoin.

A skoro jest to tak popularny algorytm funkcji skrótu, to warto zobaczyć, jak SHA-256 można wykorzystać w Java.

Praktyczny punkt widzenia

Możesz zadać sobie pytanie, a dlaczego zamiast SHA-256 nie stosować od razu SHA-512. Czasem się go stosuje. Ale z praktycznego punktu widzenia to po prostu nie ma sensu.

Po pierwsze SHA-256 potrzebuje po prostu mniej kroków do wyliczenia skrótu niż jego 512 bitowy brat. Przez to jest mniej zasobożerny.

Po drugie znalezienie kolizji dla 256 bitowego skrótu jest dla współczesnych komputerów niemożliwe. A to zapewnia bardzo wysoki poziom bezpieczeństwa.

SHA-256 Java

W dalszych rozważaniach posłużymy się znanym fragmentem tesktu:

Litwo, Ojczyzno moja! ty jesteś jak zdrowie;
Ile cię trzeba cenić, ten tylko się dowie,
Kto cię stracił. Dziś piękność twą w całej ozdobie
Widzę i opisuję, bo tęsknię po tobie.

Pan Tadeusz, Adam Mickiewicz

Strona https://emn178.github.io/online-tools/ pozwoli nam na szybkie ustalenie skrótu:

  • SHA-256: 1cd19fe89b33dd9a2abe08f1440f08bbd2194732340cec080cc45dd71541585c.

Podobnie, jak w MD5 w Java informacje te umieścimy sobie w pomocniczym interfejsie.

public interface DATA {
  String CONTENT = "Litwo, Ojczyzno moja! ty jesteś jak zdrowie;\n" +
      "Ile cię trzeba cenić, ten tylko się dowie,\n" +
      "Kto cię stracił. Dziś piękność twą w całej ozdobie\n" +
      "Widzę i opisuję, bo tęsknię po tobie.";

  String SHA256 = "1cd19fe89b33dd9a2abe08f1440f08bbd2194732340cec080cc45dd71541585c";
}

Zobaczmy, jak takie wyliczenia możemy zrealizować w Java.

Guava

Guavy Czytelnikom bloga przedstawiać nie muszę. Wielokrotnie już gościa w wielu wpisach. Podobnie, jak w przypadku MD5, również tutaj może uzyskać wynik skrótu bardzo szybko:

  @Test
  public void sha256() {
    String hash = Hashing
        .sha256()
        .hashString(DATA.CONTENT, StandardCharsets.UTF_8)
        .toString();
    assertEquals(DATA.SHA256, hash);
  }
}

Apache Commons Codec

Tutaj ponownie przychodzi nam z pomocą biblioteka commons-codec. Podobnie, jak z MD5, również i tu wykorzystamy klasę DigestUtils:

public class CommonsCodecTest {
  @Test
  public void sha256() {
    String hash = DigestUtils.sha256Hex(DATA.CONTENT);
    assertEquals(DATA.SHA256, hash);
  }
}

Aaaa … SHA-256 i MessageDigest z Java

No teraz czas na standardowe JDK. Podobnie, jak w przypadku MD5, nie jest to rozwiązanie idealne. Także nie polecam, ale jest:

  @Test
  public void sha256() throws NoSuchAlgorithmException {
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
    byte[] digest = sha256.digest(DATA.CONTENT.getBytes(StandardCharsets.UTF_8));
    String hash = encodeSHA256(digest);

    assertEquals(DATA.SHA256, hash);
  }

  private String encodeSHA256(byte[] bytes) {
    return new BigInteger(1, bytes).toString(16);
  }

Podsumowanie

W przeciwieństwie do MD5 funkcja skrótu SHA-256 zapewnia bardzo wysoki poziom bezpieczeństwa. Java w bardzo fajny i prostu sposób wspiera jej wyliczanie z pomocą kilku bibliotek.

Czy korzystasz czasem z SHA-256 w Javie?

2 9 votes
Article Rating
Subscribe
Powiadom o
guest
0 komentarzy
Inline Feedbacks
View all comments
0
Jestem ciekawy, co myślisz. Dodaj komentarz na dole!x