tisdag 26 november 2013

Luhn-algoritmen
Luhnalgoritmen, även kallad modulus-10-algoritmen eller mod-10-algoritmen, är en vanligt förekommande algoritm för att beräkna en enkelfelupptäckande kod i form av en kontrollsumma. Luhnalgoritmen används bland annat för att beräkna kontrollsiffran i svenska personnummer, samt i kreditkorts-, plusgiro-, bankgiro- och bankkontonummer. Den ingår i kontrollsiffrorna för OCR-nummer (referensnummer på inbetalningskort av typ bankgiro och plusgiro), men där är den ibland kompletterad med ytterligare en kontrollsiffra som anger entalssiffran i antalet siffror i OCR-numret. På så sätt kan man även upptäcka om en nolla lagts till eller tagits bort ur OCR-numret.
Algoritmen kan alltid upptäcka enkelfel, det vill säga en felskriven siffra, och nästan alltid ett byte av två intilliggande siffror (med undantag av om de två siffrorna är 0 och 9). Om två eller fler siffror är felskrivna finns emellertid en liten risk att felen inte upptäcks därför att de tar ut varandra så att de ger upphov till samma kontrollsiffra. Algoritmen är utformad så att det är möjligt att infoga ett godtyckligt antal nollor i början av koden utan att det påverkar kontrollsiffran (ex 000123 och 123 ger upphov till samma kontrollsiffra).
När algoritmen uppfanns fanns det krav på en enkel algoritm för att kunna kontrollera och generera kontrollsiffror och Luhn-algoritmen uppfyller detta krav. I jämförelse med moderna felupptäckande koder har algoritmen inte någon betydande styrka eller effektivitet.
Algoritmen utvecklades av Hans Peter Luhn på IBM och beskrivs i US patent 2950048, med ansökningsdatum den 6 januari 1954, och beviljandedatum den 23 augusti 1960.

Funktionsprincip

Kontroll av nummer
Vid kontroll av koden, inklusive kontrollsiffra, fungerar algoritmen på så sätt att med start från den sista siffran i koden (den minst signifikanta siffran), det vill säga kontrollsiffran, multipliceras siffrorna ömsom med 1 och ömsom med 2. Skulle något tal vid en sådan multiplikation bli större än 9 ersätts talet med dess siffersumma (eller, likvärdigt, med talet subtraherat med 9). Därefter summeras talen. Om den erhållna summan är jämnt delbar med 10 så är kontrollsiffran korrekt.
Exempel på personnummer 811218-9876:
8 1 1 2 1 8 9 8 7 6
x 2 1 2 1 2 1 2 1 2 1
^ ^ ^ ^ ^ ^ ^ ^ ^
16 1 2 2 8 18 8 14 6
8112189876
*2121212121
^^^^^^^^^
1612228188146
Tvåsiffriga produkter splittras upp i ensiffriga tal. Siffrorna summeras därefter:
1+6+1+2+2+2+8+1+8+8+1+4+6 = 50

Denna summa är delbar med 10 och sålunda har vi inte upptäckt något fel i numret.
Beräkning av kontrollsiffra
För att beräkna kontrollsiffran är förfarandet likvärdigt, med skillnaden att man multiplicerar ömsom med 2 och ömsom med 1 (det vill säga att man börjar att multiplicera den sista siffran med 2, och inte med 1 som i fallet vid kontroll). Den erhållna summan dras därefter ifrån närmast större 10-tal, varvid kontrollsiffran erhålles.
För att beräkna kontrollsiffran för det niosiffriga personnumret 811218-987 erhålles följande produkter:
8 1 1 2 1 8 9 8 7 * 2 1 2 1 2 1 2 1 2 ------------------------- ^ ^ ^ ^ ^ ^ ^ ^ 16 1 2 2 2 8 18 8 14 Tvåsiffriga produkter splittras upp i ensiffriga tal. Siffrorna summeras därefter: 1+6+1+2+2+2+8+1+8+8+1+4 = 44 Kontrollsiffran erhålls genom att detta tal subtraheras från närmast högre tiotal. 50-44 = 6 Den avslutande kontrollsiffran blir således en sexa. Det tiosiffriga personnumret blir 811218-9876

Dustin Home har kundernas lösenord i klartext.


Hemelektronikkedjan Dustin Home kan se ditt lösenord, i klartext (alltså i helt okrypterat tillstånd), har det kommit fram till sedan en kund ringde in till företagets kundsupport för hjälp.

Användaren "Lefteyet" som är medlem i forumet Sweclockers,  stort forum för dator- och teknikintresserade, blev minst sagt upprörd när han ställde frågan på forumet, "Hur kommer det sig att supportpersonalen han just ringt kan se hans lösenord - i klartext?".
Han fortsätter i Dustin Homes tråd: "Personligen tycker jag att det är näst intill skandal att ni är så vårdslösa med era kunders lösenord. Dels tjänar det inget syfte att er supportpersonal har tillgång till kundernas lösenord, och en illasinnad anställd har makt att testa kundernas inloggningsuppgifter på andra sidor för att få tillgång deras konton."

Själv jobbar jag som webbdesigner och som en programmare inom mjukvaruprogrammering och vet att säkerhet gentemot användaren är prio-ett och borde alltid vara det första man tar med i beräkningen av system, vare sig det handlar om en minitjänst eller stort nätverk av kunder och företag.
Räcker för det mesta att man använder krypteringstekniken  SHA-1 eller MD5 tillsammans med ett SALT-sträng och några andra kriterier.

Läs mer dagens artikel från Expressen.

lördag 9 november 2013

Luhn check (Personnummer och kreditkort)

God kväll läsare!

Du som tycker om matematik kommer att älska detta inlägg.

Ikväll har jag tänkt att ta upp om algoritmen Luhn.

Luhnalgoritmen, även kallad modulus-10-algoritmen eller mod-10-algoritmen, är en vanligt förekommande algoritm för att beräkna en enkelfelupptäckande kod i form av en kontrollsumma. Luhnalgoritmen används bland annat för att beräkna kontrollsiffran i svenska personnummer, samt i kreditkorts-, postgiro-, bankgiro- och bankkontonummer. Den ingår i kontrollsiffrorna för OCR-nummer (referensnummer på inbetalningskort av typ bankgiro och plusgiro), men där är den ibland kompletterad med en kontrollsiffra som anger entalssiffran i antalet siffror i OCR-numret. På så sätt kan man även upptäcka om en nolla lagts till eller tagits bort ur OCR-numret.

Algoritmen kan alltid upptäcka enkelfel, det vill säga en felskriven siffra, och nästan alltid ett byte av två intilliggande siffror (med undantag av om de två siffrorna är 0 och 9). Om två eller fler siffror är felskrivna finns emellertid en liten risk att felen inte upptäcks därför att de tar ut varandra så att de ger upphov till samma kontrollsiffra. Algoritmen är utformad så att det är möjligt att infoga ett godtyckligt antal nollor i början av koden utan att det påverkar kontrollsiffran (ex 000123 och 123 ger upphov till samma kontrollsiffra).

Den sista siffran i numret man kontrollerar är en kontrolsiffra och är den siffra som alla siffror utgår ifrån.

Som exempel tar vi kreditkortet i bilden.


Här har vi 4 baspar och en kontrollsiffra (bas 5). Sista siffran ska resultatet bli om kortet är ett giltigt kort, när vi har adderat ihop alla basparen i rätt ordning.

Vi summerar ihop alla siffror (baspar 1-4) förutom kontrollsiffran (bas 5), men varannan ska vi multiplicera med 2.






Kortnummer:5412 7599 9999 999



Steg 1, ta bort sista siffran [9] och ha det i minnet, det är vår kontrollsiffra.


Steg 1 (a

Baspar 1:5 + (4 x 2) + 1 + (2 x 2)
Baspar 2:7 + (5 x 2) + 9 + (9 x 2)
Baspar 3:9 + (9 x 2) + 9 + (9 x 2)
Baspar 4:9 + (9 x 2) + 9

Steg 1 (b

Baspar 1:5 + (8) + 1 + (4)
Baspar 2:7 + (10) + 9 + (18)
Baspar 3:9 + (18) + 9 + (18)
Baspar 4:9 + (18) + 9

Steg 1 (c, addera de tvåsiffriga tillsammans med övriga:

Baspar 1:5 + (8) + 1 + (4)
Baspar 2:7 + (1) + 9 + (1 + 8)
Baspar 3:9 + (1 + 8) + 9 + (1 + 8)
Baspar 4:9 + (1 + 8) + 9


Steg 2

Om siffran som vi multiplicerar med 2 är mer än 9 (>9), så drar vi ifrån nio i resultatet. (x>9 = x-9)
Baspar 1:5 + (8) + 1 + (4)
Baspar 2:7 + (1) + 9 + (9)
Baspar 3:9 + (9) + 9 + (9)
Baspar 4:9 + (9) + 9


Steg 3

Summerar ihop var baspar för sig:
Baspar 1:5 + (8) + 1 + (4)= 18
Baspar 2:7 + (1) + 9 + (9)= 26
Baspar 3:9 + (9) + 9 + (9)= 36
Baspar 4:9 + (9) + 9= 27

Totala summan blir:
18 + 26 + 36 + 27= 107

Uträkningen för kontrollsiffran blir således:
16 - (107 % 10)= 9

16 = antal siffror i koden.
107 = summan.
% 10 = Mod10-algoritmen (Luhn-alg).

Eftersom (107 % 10) inte är delbart med 10, är detta kortnummer inte korrekt.
Vi testar istället med 5461 8405 7166 6247.
5x2 + 4 + 6x2 + 1 + 8x2 + 4 + 0x2 + 5 + 7x2 + 1 + 6x2 + 6 + 6x2 + 2 + 4x2 + 7
(1+0) + 4 + (1+2) + 1 + (1+6) + 4 + (0+2) + 5 + (1+4) + 1 + (1+2) + 6 + (1+2) + 2 + (8) + 7
(1+0) + 4 + (1+2) + 1 + (1+6) + 4 + (0+2) + 5 + (1+4) + 1 + (1+2) + 6 + (1+2) + 2 + (8) + 7 = 62

För steg 1 (b), kan du istället för att mulitplicera talen addera de tvåsiffriga produkterna:

Baspar 1:5 + (8) + 1 + (4)
Baspar 2:7 + (1) + 9 + (1 + 8)
Baspar 3:9 + (1 + 8) + 9 + (1 + 8)
Baspar 4:9 + (1 + 8) + 9