PHP-Einfach.de
  • PHP Tutorial
  • MySQL Tutorial
  • Für Fortgeschrittene
  • Webhosting
  • Forum

Personalausweis überprüfen

20. April 2018
  1. Home
  2. »
  3. Diverses
  4. »
  5. 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!

Neuer Personalausweis:
IDD << <<<<<<<<<<<<<<<<<<<
< <<<<<<<<<<



Alter Personalausweis:
<< < <<<<<


Inhaltsverzeichnis

  • 1 Aufbau und Bedeutung der Personalausweisnummer
  • 2 Berechnung der Prüfziffern
  • 3 Sicherheit der Prüfziffer
  • 4 Script zur Überprüfung des Personalausweises

Aufbau und Bedeutung der Personalausweisnummer

personalausweis-nummerSowohl 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:

  1. 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.
  2. 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.
  3. 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).
  4. 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 &lt;&lt; <input type="text" size="10" maxlength="10" name="ida">&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;<br>
<input type="text" size="7" maxlength="7" name="idb"> &lt; <input type="text" size="8" maxlength="8" name="idc">&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;<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">&lt;&lt;
<input type="text" size="7" maxlength="7" name="idb">&lt;
<input type="text" size="7" maxlength="7" name="idc">&lt;&lt;&lt;&lt;&lt;
<input type="text" size="1" maxlength="1" name="idd"> <br>
<input type="submit" value="überprüfen">
</form>

 

 

Autor: Nils Reimers
Zurück: MD5 und SHA1 Hash-Generator
Weiter: PHP Code Verschlüsselung (PHP Obfuscator)

PHP lernen

  • PHP Tutorial
  • MySQL Tutorial
  • Für Fortgeschrittene
  • Webhosting
  • Forum
  • Blog
Mit freundlicher Unterstützung von:
  • Punkt191 Werbeagentur

Hoster – Geringste Ausfallzeit

  1. webgo Ø 0 Min.
  2. netcup Ø 0 Min.
  3. Linevast Ø 3 Min.
  4. All-Inkl.com Ø 3 Min.
  5. checkdomain Ø 5 Min.
  6. dogado Ø 6 Min.
  7. Strato Ø 8 Min.
  8. manitu Ø 9 Min.
  9. 1&1 Ø 10 Min.
  10. DomainFactory Ø 13 Min.
» Mehr erfahren

Impressum | Datenschutz | Auf PHP-Einfach.de werben

© PHP-Einfach.de 2003 - 2025

Cookie-Zustimmung verwalten
Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zurückziehst, können bestimmte Merkmale und Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Anbieter verwalten Lese mehr über diese Zwecke
Einstellungen ansehen
{title} {title} {title}