Tiivistettä Javalla

Kauan aikaa sitten kouluttelimme kurssia Java Security. Jostain syystä se ei ollut koskaan suuri hitti, niihin aikoihin tietoturva kuten testauskin oli harvojen herkkua, koska molemmat tehtiin projektien lopussa vähäisellä prioriteetilla, pienikin viivästys aiheutti sen että karsitaan tietoturvasta ja testauksesta. Ja siksi harvoja kiinnosti miten Java-kielessä voi kryptata sisältöä raskaillakin algoritmeilla tai miten dataan voi tehokkaimmin laskea tiivisteitä tai enkoodata tai dekoodata sitä esim. base64 muotoon.

Rajapinnat olivat kuitenkin suorastaan hauskoja ja helppoja, joten on vähän sääli että niitä ei ole päässyt sen enempiä käyttelemään itsekään. Pitkästä aikaa törmäsin artikkeliin jossa käsiteltiin näitä, ja ajattelin verrytellä koodiesimerkin toimivaan kuntoon. Nykyään tietoturva alkaa taas pakostakin olemaan enemmän tapetilla, ja luottamuksellisuus ja kiistämättömyys voivat olla taas tavoiteltavia asioita.

Eli tässä koodipätkä itselleni muistiin, miten Java-kielen valmiilla piirteillä voi laskea datasta sha-1 -tiivisteen, ja samaan syssyyn Base64-koodata sen siirtoa tai talletusta varten:

public class MessageDigestTest {
    public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        String sourceString = "HelloWorldTextToDigest";
        System.out.println("Source text:" + sourceString);
        String returnString = "";
        MessageDigest messageDigester = MessageDigest.getInstance("SHA-1");
        messageDigester.update(sourceString.getBytes("utf8"));
        returnString = new String(Base64.encode(messageDigester.digest()));
        System.out.println("Base64 encoded SHA-1 digest of source string:" + returnString);
    }
}

Pari huomioitavaa asiaa koodiesimerkistä:

  • Base64 on nykyisellään Javassa ei-standardi HotSpot myllyn sisäinen toteutusluokka, niinkin mehukkaassa paketissa kuin com.sun.org.apache.xerces.internal.impl.dv.util.Base64 – eli sen läsnäoloon tai rajapinnan muuttumattomuuteen ei voi luottaa
  • Java 8 tuonee mukanaan tästä standardipaketti-version, jossa rajapinta pysyy samana ja joka näin ollen löytyisi kaikista virtuaalikoneista aikanaan, Base64 muuttuu siis helpommaksi. Java 8:ssa Base64-luokka löytyy paketista java.util. Aiemmille toteutuksille voi olla hyvä käyttää jotain 3rd party kirjastoa jota voi itse hallita
  • MessageDigest taas on sisäänrakennettu hyvinkin vanha luokka. Sen kautta voi käyttää mitä hyvänsä Javalle saatavilla olevia alghoritmeja, nykyisiä ja tulevia, tiivisteen laskemiseen. Algoritmeja löytyy esim. SHA-1, SHA-256, SHA-384, SHA-512, MD2 ja MD5.
  • Samaan tapaan Java-kielessä toimii myös luokka nimeltä Cipher, jolla voi kryptata sisältöä. Sekin luodaan ensin, sitten update toiminnolla dataa sisään, ja lopuksi kryptattu versio ulos. Tähän tulee mukaan myöa avaintenhallinnan rajapinnat. Nykyisellään Cipher tukee algoritmeja kuten AES,AESWrap,ARCFOUR, DES,DESede, RSA, mutta myös esim. Blowfish, ECIES (Elliptic Curve Integrated Encryption Scheme), ja lukuisia muita. Jos ne eivät riitä, lisäalgoritmeja pystyy asentamaan. Noista mainituistahan saa nykypäivänä unohtaa heti osan algoritmeista, koska niitä ei pidetä enää turvallisena.
  • Pienenä haasteena jenkkilässä rinnastetaan kryptografiaa aseisiin ja ammuksiin, ja järeiden avainvahvuuksien algoritmeilla on rajoituksia maastaviennin suhteen. Tämän vuoksi oletus-Java asennuksessa avainten maksimivahvuus on rajoitettu ja avatakseen täyden vahvuuden avaimet täytyy asentaa virtuaalikoneeseen lisäpalikkaa. Tai kirjoittaa pieni koodihäkkäys joka poistaa eston.
  • Lisätietoa algoritmeista esim. http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#MessageDigest
Mainokset

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s