Rentao Valdivieso
© Copyrights 1998 by FoxPress, All rights reserved
FoxPress, Julio 1998
Con la moda de Internet y las compras por la Web, se está poniendo muy de moda el asunto de la seguridad. Normalmente sólo se mira la seguridad del que pone la tarjeta para que nadie vea sus números y no la pueda usar.
Pero a los programadores los que nos suelen pedir esa seguridad serían los tenderos virtuales y uno de los aspectos en los que más recalcan es que se compruebe la validez de los números de las tarjetas que se introducen antes de entregar el producto. Lo ideal sería que se estuviera conectado a la red de los bancos pero esto muchas veces no es posible (principalmente por culpa de los bancos) y la única validación que se puede hacer es comprobar que los números de la tarjeta corresponden a una tarjeta real.
Bien, pero entremos en materia, para entender mejor el método usaremos el número correcto (pero ficticio)4013 2002 0977 4812, al que me referiré a lo largo de todo el texto.
Para comprobar si una tarjeta de crédito es válida, usaremos este sencillo algoritmo:
* Los cuatro primeros números indican el banco al cual pertenece la tarjeta. En nuestro ejemplo: Pertenece al banco 4013 (Bank of Baltimore).
El primer número identifica a la tarjeta: si es un 3 la tarjeta es American Express si es un 4 la tarjeta es Visa si es un 5 la tarjeta es MasterCard si es un 6 la tarjeta es Discover
En nuestro ejemplo: 4, tarjeta Visa.
Ahora nos centraremos en todos los números que ocupan una posición impar en el número de la tarjeta:
Procederemos de la manera siguiente: a cada uno de estos números se le multiplica por dos. Si el número resultante es menor que nueve, se deja tal cual. En caso contrario, se le resta nueve
En nuestro ejemplo: 4 * 2 = 8, como es menor que nueve, lo apuntamos y seguimos. 0, ocupa posición par, por lo que continuamos 1 * 2 = 2, <9, se apunta y sigue 3, posición par 2 * 2 = 4, se apunta 0, posición par 0 * 2 = 0, seguimos 2, posición par 0 * 2 = 0, seguimos 9, posición. par 7 * 2 = 14, mayor que nueve. Se restan 9: 14 - 9 = 5, se apunta 7, posición par 4 * 2 = 8 8, posición. par 1 * 2 = 2 2, posición par
Con lo que obtenemos 8023 4002 0957 8822
Se suman entre sí todas las cifras del nuevo número obtenido.
En nuestro ejemplo:
8+0+2+3+4+0+0+2+0+9+5+7+8+8+2+2 = 60
¡Y ya esta! Si el número resultante es múltiplo de 10 (X Mod 10=0) y a la vez menor o igual a 150, es un número de tarjeta válido.
En nuestro ejemplo: 60 Mod 10 = 0 & 60 < 150, con lo que 4013 2002 0977 4812 es un número de Visa válido, perteneciente al Bank of Baltimore (Cod. 4013).
Con esta información ya podríamos crearnos un programita que nos valide las tarjetas VISA como el siguiente:
Parameter lcvisa lcVisa = strtran(lcvisa,' ','') lcVisa = strtran(lcvisa,'-','') lcVisa = padr(lcVisa,16,' ') lcValidar = '' For n = 1 to 15 Step 2 lnNum = Int(Val(Substr(lcVisa,n,1)) * 2) Do Case Case lnNum < 9 lcValidar = lcValidar + ; Substr(Str(lnNum,2),2,1) Case lnNum > 9 lcValidar = lcValidar + ; Substr(Str(lnNum-9,2), 2, 1) EndCase lcValidar = lcValidar + ; substr(lcvisa,n+1,1) EndFor lnValido = 0 For n = 1 to len(lcValidar) lnValido = lnValido + ; Val(substr(lcValidar,n,1)) EndFor If Mod(lnValido,10) = 0 And lnValido < 150 lcValidar = Val(substr(lcVisa,1,1)) Else lcValidar = 784 EndIf If lcvalidar # 784 lValido = .t. Else lvalido = .F. EndIf