JavaScript 中的計算機科學:信用卡號碼驗證
網站上的信用卡已經變得和登錄表格一樣無處不在。我在計算機科學中最喜歡的時刻之一是學習確定有效信用卡號的算法。該過程不涉及調用服務器或檢查隨附信息,只是一種使用校驗位來確定信用卡號格式是否正確的基本算法。
標識符格式
信用卡號與其他磁條卡一樣,具有 ISO/IEC 7812 中定義的標識符格式。此類標識符的格式由三部分組成:
- 發行人識別號 (IIN) – 表明發行該號碼的機構的標識符。第一個數字表示發行該號碼的機構類型(例如,銀行是 4 或 5,因此所有信用卡號都以其中一個開頭)。 IIN 包含六位數字。
- 帳號 - 長度介於 6 到 12 個數字之間的標識符。
- 校驗位 - 用於驗證標識符總和的單個數字。
這種格式的標識符長度可以在 13 到 19 位之間,可用於多種目的,但大多數人都嚴格處理信用卡號。
盧恩算法
IBM 的科學家 Hans Peter Luhn 開發了 Luhn 算法來防止數字標識符中的意外錯誤(它不是一種安全算法)。該算法是 ISO/IEC 7812 中定義的磁條識別卡(如信用卡)的基礎。
Luhn 算法本身非常簡單明了。從標識符中的最後一個數字(校驗位)開始,每隔一個數字的值加倍。如果任何一個雙位數大於 9,則該數字除以 10,餘數加 1。該值與每個其他數字的適當值相加以獲得總和。如果這個和可以被 10 整除,那麼這個數字是有效的。校驗位的目的是確保標識符能被 10 整除。這可以用 JavaScript 編寫如下:
//Luhn algorithm identifier verification
//MIT Licensed
function isValidIdentifier(identifier) {
var sum = 0,
alt = false,
i = identifier.length-1,
num;
if (identifier.length < 13 || identifier.length > 19){
return false;
}
while (i >= 0){
//get the next digit
num = parseInt(identifier.charAt(i), 10);
//if it's not a valid number, abort
if (isNaN(num)){
return false;
}
//if it's an alternate number...
if (alt) {
num *= 2;
if (num > 9){
num = (num % 10) + 1;
}
}
//flip the alternate bit
alt = !alt;
//add to the rest of the sum
sum += num;
//go to next digit
i--;
}
//determine if it's valid
return (sum % 10 == 0);
}
此方法接受字符串 identifier
作為它的參數並返回一個布爾值,指示它所代表的數字是否有效。該參數是一個字符串,可以更輕鬆地解析每個數字並允許前導零有意義。示例用法(對不起,這裡沒有實數):
if (isValidIdentifier("0123765443210190")){
alert("Valid!");
}
是的,我確實在我自己的信用卡號上對此進行了測試。不,您不能擁有這些示例文件。
驗證而非驗證
請記住,Luhn 算法是一種驗證算法,而不是驗證算法。僅僅因為標識符採用有效格式並不意味著它是當前正在使用的真實標識符。 Luhn 算法最好用於發現標識符中的無意錯誤,而不是提供任何級別的安全性。與我在 JavaScript 系列中的計算機科學的其他部分一樣,我不會出於任何原因寬恕它在實際 Web 應用程序中的使用,只是將其作為一個可以用 JavaScript 實現的有趣的計算機科學主題來介紹。
此代碼以及本系列中的其他代碼可在我的 GitHub Computer Science in JavaScript 項目中找到。