**Kontrollsumma** on informaatikas andmete tervikluse kontrollimiseks kasutatava algoritmi väljund. Kontrollsumma saadakse **kontrollsumma algoritmi** rakendamisel kindlale andmehulgale. Kui pärast andmete edastamist (näiteks internetist faili allalaadimisel) kontrollsumma klapib esialgsete andmete kontrollsummaga, siis suure tõenäosusega pole edastamisel vigu esinenud.

Kahel võrdsel andmehulgal on alati sama kontrollsumma, kuid sama tulemuse võivad anda ka erinevad andmehulgad. Seepärast kasutatakse kontrollsumma algoritmina tihti selliseid räsifunktsioone, mis juba sisendandmete vähesel muutmisel annavad drastiliselt erineva väljundi. Selliseid algoritme (näiteks SHA-2) kasutatakse andmeturbes lisaks andmete terviklikkuse tagamisele ka andmete tahtliku muutmise vältimiseks. Turvaekspert Bruce Schneier tõestas 2005. aastal algoritmi MD5 murtavuse.

Kasutusviise
------------

Erinevad andmeedastusprotokollid kasutavad paketi sisu verifitseerimiseks kontrollsummasid.

Näiteks kasutatakse kontrollsummat UDP protokolli andmepaketi päises. UDP kontrollsumma algoritmi kirjeldab RFC 768.


| + | Bitid 0–15 | 16–31 |
| --- | --- | --- |
| 0 | Lähteport | Sihtport |
| 32 | Pikkus | Kontrollsumma |
| 64 |  Andmed  |

Tarkvara levitamisel kasutatakse kontrollsummasid veendumaks, et tarkvara paigaldusfaili pole muudetud. Näiteks Linuxi distributsioonide allalaadimislehelt võib hea tava kohaselt leida CD/DVD tõmmisfaili kontrollsumma, kuigi protsess on ka automatiseeritud. Näiteks: estobuntu.

Paljud tarkvararakendused salvestavad turvakaalutlustel paroolide andmebaasi mitte paroole vaid nende kontrollsummasid ja parooli vastavuse kontrollimisel arvutavad selle kontrollsumma, mida võrdlevad andmebaasis olemasoleva kirjega.

Näited
------

Järgnevalt on toodud näiteid tihemini kasutatavate kontrollsumma algoritmide väljunditest. Väljundid on esitatud kuueteistkümnendsüsteemis.

Kontrollsummad sõnele **"Tere, maailm!"**:

```
MD5	: ff5ddfa461bcc79dc5a75b066dcf4274
SHA-1	: 60087b35764744f3dac5f32b70715f6f4b2934f8
SHA-256	: 4341bd0611d3cac56d7ebf52b41ef2fb87a69a01a645794602633627aeb37bf1
SHA-384	: 94c82fc446d9ca2fa9113b1523d2ba343fdf6e959e8ba7c6b0ff76076c2d7697d5f14718136ae1e8e72a95326a8f5b95
SHA-512	: c4ea36e0cd5846be7690c94d5760c24a83343597102c8ef67f067e6f0b226cfebd0cf5ba921f0e4abe19b92000758d55ff6c86652e729ecf946f618483866f59

```

Kontrollsummad sõnele **"Tere, maailm! "** (lisatud tühik lõppu):

```
MD5	: 867430efdfcd5180a6e7a8662f6dfb2b
SHA-1	: a0e84d2b45ddcd6cc202d317efc97f1e1c96071b
SHA-256	: 39a96937708c8f28671b71a48aad4d516f15388bc67dd01ad8b9ce5441702057
SHA-384	: 2e9a0b772e046c9c62e8bb0f17f116a6c46ca4f29e0d6643a91476411d291b90a974b270cacf1fc895b2a22351256a36
SHA-512	: e8f5b9ca94e8a4f9d506e96d9f361bc75097f71a45d13ce70094d2290bb5b03b1ee116facc1e1beb1e446ee5f85856542e2acfaabf115144cdea1e8f70a600ab

```

Koodinäited
-----------

### Java

Kontrollsummade leidmine Javas, kontrollimaks eeltoodud näidet:

```
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Checksum {
	public static String computeDigest(String algorithm, String message) {
		MessageDigest digest;
		try {
			digest = MessageDigest.getInstance(algorithm);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return "";
		}

		return new BigInteger(1, digest.digest(message.getBytes())).toString(16);
	}

	public static void main(String[] args) {
		String message = "Tere, maailm!";
		String algorithms[] = {"MD5", "SHA-1", "SHA-256", "SHA-384", "SHA-512"};
		
		for (String algorithm : algorithms) {
			System.out.format("%s\t: %s\n", algorithm, computeDigest(algorithm, message));
		}
	}
}

```

### PHP

PHP-s on võimalik lihtsasti kasutada md5-funktsiooni.

```
<?php
echo md5("Tere, maailm! ");
?>

```

Vaata ka
--------

* Räsifunktsioon
* MD5 – Ronald Rivesti loodud ühesuunaline räsifunktsiooni algoritm
* Paarsuskontroll – andmeedastuse edukuse kontrollimine paarsusbittidega

Viited
------

1. ↑

Välislingid
-----------

* Kontrollsumma definitsioon *Heikki Vallaste e-teatmikus*