Personalausweis überprüfen
Mit dem nachfolgendem Script könnt ihr die Nummer auf dem Personalausweis auf Gültigkeit überprüfen. Tragt hierzu die 4 Abschnitte ein, die ihr unten auf dem Personalausweis vorfindet ein.
Das Script überprüft die Gültigkeit der Personalausweisnummer und berechnet gewisse Daten, z.B. das Alter der Person sowie das Ablaufdatum des Personalausweises. Sowohl der alte Personalausweis (Ausgabe vor dem 1. November 2010) als auch der neue Personalausweis wird unterstützt.
Es werden keine Daten gespeichert, protokolliert oder ausgewertet!
Alter Personalausweis:
Inhaltsverzeichnis
Aufbau und Bedeutung der Personalausweisnummer
Sowohl beim alten als auch beim neuen Personalausweis befinden sich am unteren Rand vier Abschnitte mit Zahlen und Buchstaben. Diese Abschnitte haben die folgende Bedeutung:
Aufbau der Personalausweisnummer:
- Abschnitt: Dieser Abschnitt, T220001293 im oberen Bild, besteht aus der Behördenkennzahl, einer laufenden Nummer, sowie einer Prüfnummer. Die ersten vier Zeichen sind die Behördenkennzahl (T220), gefolgt von fünf Stellen für die laufende Nummer (00129). Die abschließende Stelle (3) ist eine Prüfziffer. Bei dem alten Personalausweis befindet sich danach noch die Saatsangehörigkeit der Person, in diesem Fall D für Deutschland.
- Abschnitt: Der zweite Abschnitt (6408125) enthält das Geburtsdatum sowie eine Prüfziffer. Die ersten zwei Stellen sind das Jahr (64), gefolgt vom Monat (08) und dann dem Tag (12). Sprich, Erika Mustermann wurde am 12.08.64 geboren. Die letzte Ziffer, 5 in diesem Block, ist erneut eine Prüfziffer.
- Abschnitt: Der dritte Abschnitt (2010315D) enthält das Ablaufdatum des Ausweis, eine Prüfziffer und beim Personalausweis ab 2010 die Saatsangehörigkeit. Die ersten zwei Stellen (20) sind das Jahr, gefolgt vom Monat (03) und dann dem Tag (31). Der Ausweis läuft also am 31.03.2020 ab. Danach folgt die Prüfziffer (5) und dann die Staatsangehörigkeit (D=Deutschland).
- Abschnitt: Der letzte Abschnitt, die 4 beim neuen Personalausweis im obigen Bild bzw. die 8 beim Alten, ist eine Prüfziffer über den gesamten Personalausweis. Auch wenn sich um diese Zahl viele Gerüchte ranken, dient diese nur der Überprüfung des Personalausweis.
Berechnung der Prüfziffern
In jedem der drei Abschnitte befindet sich eine Prüfziffer und der vierte Abschnitt ist eine Prüfziffer über den gesamten Personalausweis. Die Prüfziffer hat die Funktion Tippfehler bei der Eingabe der Ausweisnummer zu verhindern. Eine hohe Sicherheit bringt diese Prüfziffer nicht.
Diese Ziffer wird wie folgt berechnet:
- Zuerst werden die Buchstaben in Zahlen umgewandelt. Ein A wird zur 10, ein B zur 11 usw.
- Anschließend wird jedeZiffer mit einem Wert multipliziert. Die erste Stelle wird mit dem Wert 7 multipliziert, die zweite mit dem Wert 3, die dritte Ziffer mit dem Wert 1. Danach beginnt diese Sequenz von vorne.
- Die Prüfziffer ist dann die letzte Stelle von der Summe über die vorherigen Multiplikationen.
Beispiel:
Im obigen Bild von Erika Mustermann steht im ersten Abschnitt die Ausweisnummer T220001293. Die letzte Stelle (3) ist hierbei die Prüfziffer. Die vorherigen Stellen werden zur Berechnung dieser Prüfziffer herangezogen:
Ausweisnummer | Ziffer | Multiplikator | Produkt |
---|---|---|---|
T | 29 | 7 | 203 |
2 | 2 | 3 | 6 |
2 | 2 | 1 | 2 |
0 | 0 | 7 | 0 |
0 | 0 | 3 | 0 |
0 | 0 | 1 | 0 |
1 | 1 | 7 | 7 |
2 | 2 | 3 | 6 |
9 | 9 | 1 | 9 |
Summe | 233 |
Die Summe beträgt 233 und die letzte Stelle, 3, ist die Prüfziffer. Diese Prüfziffer stimmt überein mit der übergeben Prüfziffer.
Auf diese Weise werden die ersten drei Abschnitt jeweils überprüft. Der letzte Abschnitt, die 4 bei Erika Mustermann, ist eine Prüfziffer über alle vorherigen Abschnitte. Dazu werden alle Abschnitte inkl. der Prüfziffern aneinandergehängt und die Prüfziffer wird wie oben beschrieben berechnet.
Sicherheit der Prüfziffer
Der Gesetzgeber erlaubt für manche Anwendungen mittels der Überprüfung der Personalausweisnummer eine Altersverifikation durchzuführen, sprich, zu überprüfen, ob die Person schon volljährig ist. Dieses Verfahren ist aber leider nicht sehr sicher und lässt sich einfach umgehen. Man kann online eine andere Personalausweisnummer heraussuchen, beispielsweise die von Erika Mustermann, und diese angeben. Ebenso existieren Generatoren, die gültige Ausweisnummern generieren.
Sofern Altersverifikation zwingend erfordernd für die Website ist, sollte man auf andere Verifikationsverfahren umsteigen.
Script zur Überprüfung des Personalausweises
Das Script dahinter sieht wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
<?php //Pruefnummer ueberpruefen function check_number($id, $checknumber) { $p = 7; $sum = 0; for($i=0; $i < strlen($id); $i++) { $char = $id{$i}; if($char >= '0' && $char <= '9') $int = intval($char); else $int = ord($char)-55; $sum += $int*$p; if($p==1) $p=7; else if($p==3) $p=1; else if($p==7) $p=3; } $last_number = substr(strval($sum), -1); return $last_number == $checknumber; } //Gibt die Art (neu vs. alt) des Personalausweis zurück function perso_type($id) { $splits = explode(" ", strtoupper($id)); if(strlen($splits[0]) == 11 && strlen($splits[1]) == 7 && strlen($splits[2]) == 7 && strlen($splits[3]) == 1) { return 'old'; } else if(strlen($splits[0]) == 10 && strlen($splits[1]) == 7 && strlen($splits[2]) == 8 && strlen($splits[3]) == 1) { return 'new'; } else { return 'unknown'; } } //Sind die Prüfziffern gültig function perso_checksum($id) { $splits = explode(" ", strtoupper($id)); $checksums = array(); $perso_type = perso_type($id); if($perso_type == 'unknown') { return false; } $checksums[] = array(substr($splits[0],0,9), substr($splits[0],9,1)); $checksums[] = array(substr($splits[1],0,6), substr($splits[1],6,1)); $checksums[] = array(substr($splits[2],0,6), substr($splits[2],6,1)); $checksums[] = array(substr($splits[0],0,10).substr($splits[1],0,7).substr($splits[2],0,7), $splits[3]); //Überprüfung der Checksummen foreach($checksums as $checksum) { if(!check_number($checksum[0], $checksum[1])) { return false; } } return true; } //Ist der Perso noch gültig? function perso_gueltig($id) { $splits = explode(" ", $id); $valid_until = mktime(0,0,0, substr($splits[2], 2, 2) , substr($splits[2], 4, 2) , "20".substr($splits[2], 0, 2)); //Ist der Perso noch gültig if(time() > $valid_until) return false; return true; } //Informationen aus dem Perso beziehen function perso_info($id) { $splits = explode(" ", $id); //$return: Ein Objekt mit den Daten aus der Ausweisnummer $return = new stdClass(); $return->perso_type = perso_type($id); $return->geb = new stdClass(); $return->geb->tag= $splits[1]{4} . $splits[1]{5}; //Geburtstag $return->geb->monat = $splits[1]{2} . $splits[1]{3}; //Geburtsmonat $return->geb->jahr = $splits[1]{0} . $splits[1]{1}; //Geburtsjahr if($return->geb->jahr > intval(date("y"))) { $return->geb->jahr = "19".$return->geb->jahr; } else { $return->geb->jahr = "20".$return->geb->jahr; } $alter = date("Y") - $return->geb->jahr; //Hatte er schon Geburtstag? if( (date("n") < $return->geb->monat) OR (date("n") == $return->geb->monat AND date("j") < $return->geb->tag) ) { $alter--; } $return->alter = $alter; if($alter >= 18) { $return->volljaehrig = true; } else { $return->volljaehrig = false; } $return->ablauf = new stdClass(); $return->ablauf->tag = $splits[2]{4} . $splits[2]{5}; //Ausweis Ablauf Tag $return->ablauf->monat = $splits[2]{2} . $splits[2]{3}; //Ausweis Ablauf Monat $return->ablauf->jahr = "20".$splits[2]{0} . $splits[2]{1}; //Ausweis Ablauf Jahr if($return->perso_type == 'old') { $return->herkunft = $splits[0]{10}; } else { $return->herkunft = $splits[2]{7}; } //Ein Deutscher? if(strtolower($return->herkunft) == "d") { $return->deutscher = true; } else { $return->deutscher = false; } //Behördenkennzahl als Nummer $return->behoerdenkennzahl = substr($splits[0], 0, 4); return $return; } //Beispiel zur Verwendung if(isset($_GET['check'])) { $perso_id = $_POST['ida']." ".$_POST['idb']." ".$_POST['idc']." ".$_POST['idd']; //Oder: //$perso_id = "1234567891D 2345678 9012345 6" if(perso_checksum($perso_id)) { echo "Personalausweisnummer korrekt!"; if(!perso_gueltig($perso_id)) { echo "<br> <b>Perso ist abgelaufen!</b>"; } echo "<br><br> Daten der Ausweisnummer: <pre>"; $data = perso_info($perso_id); print_r($data); echo "</pre>"; //Zugriff z.B. so: //Alter: $data->alter; //Geburtsmonat: $data->geb->monat; //Ablauftag: $data->ablauf->tag; } else { echo "Personalausweisnummer falsch!<br><br>"; } } ?> <!-- Kleines Anwendungsbeispiel --> Neuer Personalausweis:<br> <form action="?check=1" method="post" > IDD << <input type="text" size="10" maxlength="10" name="ida"><<<<<<<<<<<<<<<<<br> <input type="text" size="7" maxlength="7" name="idb"> < <input type="text" size="8" maxlength="8" name="idc"><<<<<<<<<<<input type="text" size="1" maxlength="1" name="idd"> <br> <input type="submit" value="überprüfen"> </form> <br><hr><br> Alter Personalausweis:<br> <form action="?check=1" method="post" > <input type="text" size="11" maxlength="11" name="ida"><< <input type="text" size="7" maxlength="7" name="idb">< <input type="text" size="7" maxlength="7" name="idc"><<<<< <input type="text" size="1" maxlength="1" name="idd"> <br> <input type="submit" value="überprüfen"> </form> |
Autor: Nils Reimers