{"id":2310,"date":"2013-09-11T19:10:08","date_gmt":"2013-09-11T17:10:08","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2310"},"modified":"2013-09-11T19:17:13","modified_gmt":"2013-09-11T17:17:13","slug":"kreditkartennummern-in-java-testen","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2013\/09\/kreditkartennummern-in-java-testen\/","title":{"rendered":"Kreditkartennummern in Java testen"},"content":{"rendered":"<p><i>Sind Kreditkartennummern korrekt aufgebaut? Wie lassen sich sich Kreditkartennummern generieren?<\/i><\/p>\n<p>E-Commerce-L\u00f6sungen sind im Internet mittlerweile h\u00e4ufig anzutreffen. Lassen sich f\u00fcr kleine Betr\u00e4ge Sonderl\u00f6sungen finden, werden f\u00fcr gr\u00f6\u00dfere Betr\u00e4ge immer noch Kreditkarten verwendet. Grund genug f\u00fcr uns Java-Programmierer, die Nummern der Karten zu testen, um zu \u00fcberpr\u00fcfen, ob uns nicht ein Anwender t\u00e4uschen wollte.<\/p>\n<p>Die Nummer einer Kreditkarte setzt sich nicht willk\u00fcrlich zusammen. Die Nummern von Karten eines bestimmten Herstellers bestehen aus einer festen Anzahl von meistens 14 bis 16 Ziffern. Als Kennung f\u00fcr einen Hersteller (Visa (Veni, Vidi, VISA: I came, I saw, I did a little shopping.) , MasterCard, American Express) ist jeder Nummer eine zus\u00e4tzliche Kennung von einer bis vier Ziffern vorangestellt. Die Ziffern der Kartennummer werden durch mathematische Verfahren \u00fcberpr\u00fcft. Wir wollen eines dieser Verfahren auch kennen lernen; den so genannten <a href=\"https:\/\/de.wikipedia.org\/wiki\/Luhn-Algorithmus\">Luhn-Algorithmus<\/a>. Dieser Algorithmus testet die Korrektheit des Aufbaus einer Nummernfolge. Die letzte Ziffer ist oft eine berechnete Checksummen-Ziffer.<\/p>\n<p>Die folgende Tabelle gibt eine \u00dcbersicht \u00fcber einige Kartenhersteller. Sie f\u00fchrt die Kennung, die L\u00e4nge der Kartennummer und ein g\u00fcltiges Beispiel auf:<\/p>\n<table cellspacing=\"3\" cellpadding=\"0\" border=\"0\">\n<tbody>\n<tr>\n<td>\n<p><strong>Hersteller<\/strong><\/p>\n<\/td>\n<td>\n<p><strong>Anfang<\/strong><\/p>\n<\/td>\n<td>\n<p><strong>Gesamtl\u00e4nge<\/strong><\/p>\n<\/td>\n<td>\n<p><strong>Beispiel<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>Visa<\/p>\n<\/td>\n<td>\n<p>4<\/p>\n<\/td>\n<td>\n<p>13,16<\/p>\n<\/td>\n<td>\n<p>4111 1111 1111 1111<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>Master<\/p>\n<\/td>\n<td>\n<p>51,52,53,54,55<\/p>\n<\/td>\n<td>\n<p>16<\/p>\n<\/td>\n<td>\n<p>5500 0000 0000 0004<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>Diner\u2019s Club11<\/p>\n<\/td>\n<td>\n<p>30,36,38<\/p>\n<\/td>\n<td>\n<p>14<\/p>\n<\/td>\n<td>\n<p>3000 0000 0000 04<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>American Express12<\/p>\n<\/td>\n<td>\n<p>34,37<\/p>\n<\/td>\n<td>\n<p>15<\/p>\n<\/td>\n<td>\n<p>3400 0000 0000 009<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>Discover<\/p>\n<\/td>\n<td>\n<p>6011<\/p>\n<\/td>\n<td>\n<p>16<\/p>\n<\/td>\n<td>\n<p>6011 0000 0000 0004<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>en Route<\/p>\n<\/td>\n<td>\n<p>2014,21<\/p>\n<\/td>\n<td>\n<p>15<\/p>\n<\/td>\n<td>\n<p>2014 0000 0000 009<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>JCB<\/p>\n<\/td>\n<td>\n<p>3088,3096,3112,3158,3337,3528<\/p>\n<\/td>\n<td>\n<p>16<\/p>\n<\/td>\n<td>\n<p>3088 0000 0000 0009<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Neben den Herstellernummern sind auch folgende Nummern von den ausgebenden Ban\u00adken im Umlauf: Manufacturers Hanover Trust (1033), Citibank (1035), Chemical Bank (1263), Chase Manhattan (1665), Bank of America (4024), Citicorp (4128), New Era Bank (4209), HHBC (4302), Imperial Savings (4310), MBNA (4313), California Federal (4317), Wells Fargo (5282), Citibank (5424), Wells Fargo (5410), Bank of New York (5432), MBNA (6017). Carte Blanche und Diner\u2019s Club haben die gleichen Nummern.<\/p>\n<p><i>Einen Abend im Februar 1950 verga\u00df Frank MacNamara seine Brieftasche. Er kam auf die Idee, eine Kredit\u00adkarte aus Karton anzubieten. Mit seinen Freunden gr\u00fcndete er am 28.2.1950 den Diner&#8217;s Club, der im Gr\u00fcn\u00adderjahr mehr als 10.000 Mitglieder und 1.000 Vertragspartner hatte. So war die erste Kreditkarte geboren. Im Jahre 1958 entschloss sich das internationale Transport-, Reise-, und Finanzierungsunternehmen American Express, eine eigene Karte herauszugeben.<\/i><\/p>\n<p><b>Die \u00dcberpr\u00fcfung mit dem Luhn-Algorithmus<\/b><\/p>\n<p>Der Luhn-Algorithmus (auch modulus 10 oder mod 10-Algorithmus genannt) basiert auf dem ANSI-Vorschlag X4.13. Er wurde Ende 1960 von einer Gruppe Mathematiker ausgearbeitet und ver\u00f6ffentlicht. Danach nutzten Kreditkartenhersteller dieses Verfahren zur Pr\u00fcfung der Kreditkartennummern. Auch die Versichertennummer in Kanada, die Canadian Social Insurance Number (CSIN), wird \u00fcber das Luhn-Verfahren gepr\u00fcft.<\/p>\n<p>Der Algorithmus testet, ob die letzte Ziffer der Kreditkartennummer korrekt zu den angegebenen Zahlen passt. Die Testziffer wird von allen Ziffern au\u00dfer der letzten Ziffer berechnet und anschlie\u00dfend mit der angegebenen Testziffer verglichen. Stimmt sie \u00fcberein, ist die Karte seitens der Pr\u00fcfnummer in Ordnung. Wir wollen das Verfahren hier nicht n\u00e4her vertiefen, sondern einfach den Algorithmus angeben:<\/p>\n<pre lang=\"java\">class LuhnTest\n{\n  static boolean luhnTest( String s )\n  {\n    int len = s.length();\n\n    int digits[] = new int[len];\n\n    for ( int i = 0; i &lt; len; i++ )\n    {\n      try {\n        digits[i] = Integer.parseInt( s.substring(i,i+1) );\n      }\n      catch ( NumberFormatException e ) {\n        System.err.println( e );\n        return false;\n      }\n    }\n\n    int sum=0;\n\n    while ( len &gt; 0 )\n    {\n      sum += digits[len-1];\n      len--;\n\n      if ( len &gt; 0 )\n      {\n        int digit = 2*digits[len-1];\n        sum += ( digit&gt;9) ? digit-9 : digit;\n\n        len--;\n      }\n    }\n\n    return ( sum%10 == 0 );\n  }\n\n\n  static boolean isVisa( String s )\n  {\n    if ( ( (s.length() == 16) || (s.length() == 13) ) &amp;&amp;\n          (s.charAt(0) == '4') )\n      return luhnTest( s );\n\n    return false;\n  }\n\n  public static void main( String args[] )\n  {\n    System.out.println( luhnTest( &quot;4111111111111111&quot; ) );\n    System.out.println( luhnTest( &quot;5500000000000004&quot; ) );\n    System.out.println( luhnTest( &quot;340000000000009&quot; ) );\n    System.out.println( luhnTest( &quot;30000000000004&quot; ) );\n    System.out.println( luhnTest( &quot;601100000000000&quot; ) );\n    System.out.println( luhnTest( &quot;201400000000009&quot; ) );\n    System.out.println( luhnTest( &quot;3088000000000009&quot; ) );\n    System.out.println( luhnTest( &quot;9238475098787444&quot; ) );\n\n    System.out.println( isVisa( &quot;4111111111111111&quot; ) );\n    System.out.println( isVisa( &quot;5500000000000004&quot; ) );\n\n\n    \/\/ B\u00f6se: Visa-Nummer generieren\n\n    char[] c = &quot;4123456789123456&quot;.toCharArray();\n\n    while ( !isVisa(new String(c)) )\n      c[(int)(Math.random()*c.length-1)+1] = (char)('0'+Math.random()*9.9);\n\n    System.out.println( c );\n  }\n}<\/pre>\n<p>Im Quelltext ist eine zus\u00e4tzliche Methode eingebaut, die testet, ob die Karte von Visa ist. Dazu m\u00fcssen wir nur \u00fcberpr\u00fcfen, ob die erste Ziffer eine 4 und die gesamte Zahl nach dem Luhn-Verfahren g\u00fcltig ist. Andere Tests sind genauso einfach durchzuf\u00fchren. Eine m\u00f6gliche Erweiterung w\u00e4re, die Methode fehlertoleranter zu gestalten, indem Trennzeichen herausgefiltert werden. Dies und die Implementierung der \u00fcbrigen Tests \u00fcberlasse ich als \u00dcbung den Lesern. <\/p>\n<p>Wir beginnen mit einer vorgegebenen, unsinnigen Kartennummer, deren erste Stelle &quot;4&quot; ist, wie f\u00fcr eine Visa-Karte erforderlich. Anschlie\u00dfend \u00e4ndern wir in einer Schleife eine zuf\u00e4llig ausgew\u00e4hlte Stelle der Kartennummer (au\u00dfer der ersten) in eine ebenfalls zuf\u00e4llig bestimmte Ziffer aus dem Bereich &quot;0&quot; bis &quot;9&quot;. Das wiederholen wir so lange, bis die abgewandelte Zahl irgendwann passt.<\/p>\n<p><b>Beispiel<\/b> Mit diesen Methoden ist es nat\u00fcrlich leicht m\u00f6glich, Nummern zu erzeugen. Betrachten wir Folgendes:<\/p>\n<pre lang=\"java\">char c[] = &quot;4123456789123456&quot;.toCharArray();\nwhile ( !isVisa(new String(c)) )\n  c[(int)(Math.random()*c.length-1)+1] = (char)('0'+Math.random()*9.9);\nSystem.out.println( c );<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Sind Kreditkartennummern korrekt aufgebaut? Wie lassen sich sich Kreditkartennummern generieren? E-Commerce-L\u00f6sungen sind im Internet mittlerweile h\u00e4ufig anzutreffen. Lassen sich f\u00fcr kleine Betr\u00e4ge Sonderl\u00f6sungen finden, werden f\u00fcr gr\u00f6\u00dfere Betr\u00e4ge immer noch Kreditkarten verwendet. Grund genug f\u00fcr uns Java-Programmierer, die Nummern der Karten zu testen, um zu \u00fcberpr\u00fcfen, ob uns nicht ein Anwender t\u00e4uschen wollte. Die Nummer [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[1],"tags":[],"class_list":["post-2310","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2310","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=2310"}],"version-history":[{"count":6,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2310\/revisions"}],"predecessor-version":[{"id":2316,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2310\/revisions\/2316"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2310"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2310"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2310"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}