信用卡卡号验证码
信用卡号的最后一个数字,就是输入过程中用来检验卡号是否正确时,所使用的核对数字。虽然此核对演算法早已公开(ISO 2894),但是目前还是很多人并不清楚它的作法。
演算法执行过程如下:
1.将卡号上的每个数字乘上其权重(weight),如果卡号上的数字个数是偶数,那么第一个数字的权重就是2,若是奇数,那么权重就给1,剩下来的数 字,根据第一个数字依序给定。例如某信用卡卡号的数字个数为偶数,那么从第一位数字开始的权重依序为2、1、2、1、2、1 ...。
2.如果数字乘上自己的权重后比9还大,那么就从这加权数字里扣除9。
3.接下来将所有处理过的加权数字全部加总起来,并且除以10,取其余数。
4.此余数应该是0,否则就可能是输入过程有误,也有可能信用卡号是假的。
这样的算法可以用来检验数字输入过程中可能发生的数字调换、位移等等输入错误。此外这种算法也可以用在其它方面,当作安全装置来使用【注】。如果我们把算法写成Perl程式的话,便如下所示:
【注】让我们担心的是,某些商家竟使用此演算法当作是检验信用卡正确性的低价方法。然而此方法只能告诉我们卡号输入过程是否错误发生,却无法确切告诉我们信用卡的正确性。只要有心人蓄意造假,业者很可能遭受严重的损失。
sub validate_cc {
local ($cc) = $_[0];
local ($digit,$sum,$val);
local ($weight) = 1;
$weight = 2 if (length($cc) %2 ==0);
while($cc ne ""){
$digit = substr($cc,0,1);
$cc = substr($cc,1);
$val = $digit * $weight;
$val-=9 if ($val>9);
$sum += $val;
$weight = ($weight==2) ? 1 : 2;
}
return ($sum % 10) == 0;
}
现在我们举一个实例来看看(读者也可以使用你信用卡号上的数字来试试看)。这是Simson所持有的美国运通卡号码:3728 024906 54059。
卡号上共有15个数字。所以第一个数字的权重为1,全部的权重分别是1、2、1、2、1、2、1、2、1、2、1、2、1、2、1。我们将每个数字分别乘上它的权重:
(3 x 1) , (7 x 2) , (2 x 1) , (8 x 2) , (0 x 1) , (2 x 2) , (4 x 1) , (9 x 2) ,
(0 x 1) , (6 x 2) , (5 x 1) , (4 x 2) , (0 x 1) , (5 x 2) , (9 x 1)
得到它们个别的加权值:
(3) , (14) , (2) , (16) , (0) , (4) , (4) , (18) ,
(0) , (12) , (5) , (8) , (0) , (10) , (9)
将所有大于9的加权值扣除9,然后相加:
(3) + (5) + (2) + (7) + (0) + (4) + (4) + (9) +
(0) + (3) + (5) + (8) + (0) + (1) + (9) = 60
最后将所有值相加,并且除以10,我们所得到的结果果然是0。
60 mod 10 = 0
请注意:千万别冒用Simson的信用卡帐号。冒用信用卡是条重罪。
信用卡交易核对单
信用卡交易核对单可以让我们清楚知道当次的交易讯息。在过去某段时间内,它都是使用纸条来进行记录,并且在每次信用交易之后必须拿给客户核对。渐 渐地服务商发觉使用纸条的费用过高,不够经济,所以在1970年代中期,Visa与MasterCard改变原有运作方式,每个月将信用交易资料
后, 才把核对单送回给客户以供核对使用。 1980年代,美国运通公司开始将所有核对单资料数位化,并将交易讯息列印出来送回给客户进行确认。现在,客户已经很难见到最原始的核对单了。
随着时间推移,交易核对单上的资讯也持续地增加中。下面所列出的要项是核单资料 不可漏缺的部分:
*客户姓名
*客户的信用卡号码
*客户的住址
*客户编号
*交易日期
*交易金额
*商品或是服务的种类
*单据号码
*授权代码
*销售商的名称
虽然过去20年来,电脑已经逐渐取代传统的文件作业方式,但是原有的文件内容我们仍须完整保留下来,因为这些文件资料有很重要的价值,它们能够协助我们调查过去的交易记录,并且提供我们信用诈欺事件的线索。