剛剛在扒12306能改火車(chē)席位的代碼,貌似這個(gè)bug現(xiàn)在已經(jīng)被修復(fù)了。
不過(guò)扒的過(guò)程中發(fā)現(xiàn)了身份證驗(yàn)證的一段代碼,就研究了一下,發(fā)現(xiàn)果然不是隨便生成的[哈哈]。
來(lái)說(shuō)一下18位的身份證號(hào)碼:
前6位號(hào)碼是地區(qū)編號(hào),(地址碼) 其中前兩位是省份。
中間8位是出生年月日。
再3位 是順序碼,貌似是那一天第多少個(gè)出生的。(這3位的最后一位,也就是身份證號(hào)碼的第17位,奇數(shù)為男偶數(shù)為女)
最后1位,校驗(yàn)碼,驗(yàn)證身份證號(hào)真?zhèn)巍?/p>
驗(yàn)證碼的算法:
1:身份證號(hào)碼前17位數(shù)分別乘以以下系數(shù):7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2;
2:將以上分別相乘得到的結(jié)果相加:
第一位*7 + 第二位*9 +…… + 第17位*2
3:以上結(jié)果除以11,得出余數(shù);
4:余數(shù)0-10 分別對(duì)應(yīng)下數(shù)字:1,0,X,9,8,7,6,5,4,3,2。(0=>1,1=>0,2=>X,3=>9……)。
上面那個(gè)數(shù)字就是第18位
以下代碼扒自12306
function validateFirIdCard(g) {
var f = 0;
var a;
var e = {
11 : "北京",
12 : "天津",
13 : "河北",
14 : "山西",
15 : "內(nèi)蒙",
21 : "遼寧",
22 : "吉林",
23 : "黑龍",
31 : "上海",
32 : "江蘇",
33 : "浙江",
34 : "安徽",
35 : "福建",
36 : "江西",
37 : "山東",
41 : "河南",
42 : "湖北",
43 : "湖南",
44 : "廣東",
45 : "廣西",
46 : "海南",
50 : "重慶",
51 : "四川",
52 : "貴州",
53 : "云南",
54 : "西藏",
61 : "陜西",
62 : "甘肅",
63 : "青海",
64 : "寧夏",
65 : "新疆",
71 : "臺(tái)灣",
81 : "香港",
82 : "澳門(mén)",
91 : "國(guó)外"
};
if (g.length == 15) {
a = idCardUpdate(g)
} else {
a = g
}
if (!/^\d{17}(\d|x)$/i.test(a)) {
return false
}
a = a.replace(/x$/i, "a");
if (e[parseInt(a.substr(0, 2))] == null) {
return false
}
var c = a.substr(6, 4) + "-" + Number(a.substr(10, 2)) + "-" + Number(a.substr(12, 2));
var h = new Date(c.replace(/-/g, "/"));
if (c != (h.getFullYear() + "-" + (h.getMonth() + 1) + "-" + h.getDate())) {
return false
}
for (var b = 17; b >= 0; b--) {
f += (Math.pow(2, b) % 11) * parseInt(a.charAt(17 - b), 11)
}
if (f % 11 != 1) {
return false
}
return true
}
function idCardUpdate(g) {
var b;
var f = /^(\d){15}$/;
if (f.test(g)) {
var e = 0;
var a = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var d = new Array("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2");
g = g.substr(0, 6) + "19" + g.substr(6, g.length - 6);
for (var c = 0; c < g.length; c++) {
e += parseInt(g.substr(c, 1)) * a[c]
}
g += d[e % 11];
b = g
} else {
b = "#"
}
return b