去哪兒網購票填寫身份證號時的真實驗證數據是怎麼得到的?

在去哪兒購買機票,填寫乘機人信息時,身份證號有驗證提醒,試了一下拿真實存在的身份證號只錯一個數(格式完全相同)的情況下也能檢出身份證號錯誤,但是故意錯誤的名字是匹配不出的,也就是說不能驗證到人,但是能檢測出身份證號是否真實存在,身份證數據應該是真實匹配的,那麼是怎麼做到的呢?介面和數據的來源是從哪裡獲取的?

如圖。

我使用我和女友的真實身份證號,都是驗證通過的。

我改變身份證號的最後幾位,或生日的那四位中的一位,位數和格式是不變的,都能檢測出錯誤。

但是正確的身份證號和錯誤的人名搭配無法檢測到。


不需要查詢,直接計算校驗碼即可。身份證校驗碼_百度百科

以下為簡單的 Python 實現,輸入參數 id 為身份證號碼字元串形式。

def check(id):
c = 0
for (d, p) in zip(map(int, id[:~0]), range(17, 0, -1)):
c += d * (2 ** p) % 11
return id[~0] == "10X98765432"[c % 11]

也可以試試我寫的這個網頁版:身份證號碼驗證


身份證是有一定規律生成的,直接計算一下就可以知道真假號碼,當然只是初步的計算,並不能保證真實存在該人。

下面是百度百科摘來的

身份證校驗碼_百度百科

================

身份證號碼中的校驗碼是身份證號碼的最後一位,是根據〖中華人民共和國國家標準GB 11643-1999〗中有關公民身份號碼的規定,根據精密的計算公式計算出來的,公民身份號碼是特徵組合碼,由十七位數字本體碼和一位數字校驗碼組成。排列順序從左至右依次為:六位數字地址碼,八位數字出生日期碼,三位數字順序碼,最後一位是數字校驗碼。

計算方法

1、將前面的身份證號碼17位數分別乘以不同的係數。第i位對應的數為[2^(18-i)]mod11。從第一位到第十七位的係數分別為:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;

2、將這17位數字和係數相乘的結果相加;

3、用加出來和除以11,看餘數是多少?;

4、餘數只可能有0 1 2 3 4 5 6 7 8 9 10這11個數字。其分別對應的最後一位身份證的號碼為1 0 X 9 8 7 6 5 4 3 2;

5、通過上面得知如果餘數是2,就會在身份證的第18位數字上出現羅馬數字的Ⅹ。如果餘數是10,身份證的最後一位號碼就是2;

例如:某男性的身份證號碼是34052419800101001X。我們要看看這個身份證是不是合法的身份證。

首先:我們得出,前17位的乘積和是189

然後:用189除以11得出的結果是17 + 2/11,也就是說餘數是2。

最後:通過對應規則就可以知道餘數2對應的數字是x。所以,這是一個合格的身份證號碼。


我在去哪兒上買了張南方航空的機票之後的詐騙故事。


這個是公安部在15位身份證升級到18位身份證號時候,廣為人知的新聞,就是,第18位是校驗位。此事開始於1997年,大量報道發生在1998年。所以,80後、90後的孩子們不知道、不了解這個事情,是很正常的。


有身份證驗證介面。吧@_@


身份證最後一位是校驗位


推薦閱讀:

中國身份證是由日本公司富士施樂製造的么?
一張第二代身份證被製造出來的整個流程是怎樣的?
二代身份證為什麼需要正反面複印?
警察在什麼情況下可以查驗路人身份證?
由公安部門或民政部門做一個註銷身份證的網站可行嗎?

TAG:身份證 | 去哪兒Qunar | 身份驗證 | 身份證安全 |