|
信用卡卡號核對演算法
信用卡號的最後一個數字,就是輸入過程中用來檢驗卡號是否正確時,所使用的核對數字。雖然此核對演算法早已公開(ISO 2894),但是目前還是很多人並不清楚它的作法。
演算法執行過程如下:
- 將卡號上的每個數字乘上其權重(weight),如果卡號上的數字個數是偶數,那麼第一個數字的權重就是 2,若是奇數,那麼權重就給 1,剩下來的數字,根據第一個數字依序給定。例如某信用卡卡號的數字個數為偶數,那麼從第一位數字開始的權重依序為
2、1、2、1、2、1 ...。
- 如果數字乘上自己的權重後比 9 還大,那麼就從這加權數字裡扣除 9。
- 接下來將所有處理過的加權數字全部加總起來,並且除以 10,取其餘數。
- 此餘數應該是 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 年來,電腦已經逐漸取代傳統的文件作業方式,但是原有的文件內容我們仍須完整保留下來,因為這些文件資料有很重要的價值,它們能夠協助我們調查過去的交易記錄,並且提供我們信用詐欺事件的線索。
|