返回

Aadhaar 号码验证:实用指南及实现方法

java

Aadhaar 号码验证的实践指南

Aadhaar ( आधार ) 是印度政府发行的12位个人身份识别号码。 在应用程序中验证 Aadhaar 号码的有效性是一项常见且重要的需求,能确保用户输入的数据正确有效,同时提高数据的准确性和可靠性。 验证 Aadhaar 号码不仅仅是检查位数,还需要一定的逻辑判断。本文讨论如何高效可靠地解决这个问题,提供一些有价值的实践方案。

校验规则

Aadhaar 号码是一个12位的数字,其格式看似简单,但实际包含校验逻辑。它的最后一位数字是通过一个叫做Verhoeff算法生成的校验位。 这种算法能确保号码具有较高的防伪性能。 在验证的时候,仅仅检查位数是不够的, 需要按照校验算法去验证。

解决方案 1: 使用正则表达式进行格式验证

最基本的验证是使用正则表达式检查输入是否为 12 位数字。 这可以排除大量无效输入。 然而,这种方法不能验证 Aadhaar 号码本身的校验和。

操作步骤:

  1. 定义正则表达式 ^\d{12}$ 用于匹配 12 位数字。
  2. 使用程序语言(如 JavaScript, Python, Java 等)内置的正则匹配功能。
  3. 如果匹配成功,则格式验证通过,进入后续的校验步骤。

代码示例(JavaScript):

function isValidAadhaarFormat(aadhaarNumber) {
  const aadhaarRegex = /^\d{12}$/;
  return aadhaarRegex.test(aadhaarNumber);
}

console.log(isValidAadhaarFormat("123456789012")); // 输出 true
console.log(isValidAadhaarFormat("12345678901"));  // 输出 false
console.log(isValidAadhaarFormat("abc123456789")); // 输出 false

这个方法只是第一步,它快速过滤不符合长度规范的输入。但要进行更严格的校验,需要引入校验算法。

解决方案 2:实现 Verhoeff 校验算法

更深入的验证是实现 Verhoeff 校验算法,这也是 Aadhaar 号码校验的核心部分。此算法虽然相对复杂,但是可以提供更高的安全性。 此方法可以有效确保号码的真实有效。

算法步骤:

  1. 创建乘法表 (d table) :
   0 1 2 3 4 5 6 7 8 9
0| 0 1 2 3 4 5 6 7 8 9
1| 1 2 3 4 0 6 7 8 9 5
2| 2 3 4 0 1 7 8 9 5 6
3| 3 4 0 1 2 8 9 5 6 7
4| 4 0 1 2 3 9 5 6 7 8
5| 5 9 8 7 6 0 4 3 2 1
6| 6 5 9 8 7 1 0 4 3 2
7| 7 6 5 9 8 2 1 0 4 3
8| 8 7 6 5 9 3 2 1 0 4
9| 9 8 7 6 5 4 3 2 1 0
  1. 创建置换表 (permutation or p table)[0,1,2,3,4,5,6,7,8,9], [1,5,7,6,2,8,3,0,9,4], [5,8,0,3,7,9,6,1,4,2]

  2. 从右向左遍历号码的每一个数字。 根据遍历到的位数次序和预先定义好的p表找到索引p_index.

  3. d[previousResult][currentDigit] 公式执行校验算法,并更新 previousResult。初始 previousResult 为 0

  4. 如果 final result 是 0,那么该Aadhaar号码是有效的;反之无效。

代码示例(Python):

def gen_d_table():
    d_table=[
       [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
       [1, 2, 3, 4, 0, 6, 7, 8, 9, 5],
       [2, 3, 4, 0, 1, 7, 8, 9, 5, 6],
       [3, 4, 0, 1, 2, 8, 9, 5, 6, 7],
       [4, 0, 1, 2, 3, 9, 5, 6, 7, 8],
       [5, 9, 8, 7, 6, 0, 4, 3, 2, 1],
       [6, 5, 9, 8, 7, 1, 0, 4, 3, 2],
       [7, 6, 5, 9, 8, 2, 1, 0, 4, 3],
       [8, 7, 6, 5, 9, 3, 2, 1, 0, 4],
       [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
       ]
    return d_table

def gen_p_table():
     p_table = [
          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
          [1, 5, 7, 6, 2, 8, 3, 0, 9, 4],
          [5, 8, 0, 3, 7, 9, 6, 1, 4, 2],
          ]
     return p_table

def is_valid_aadhaar(aadhaar_number):
    if not aadhaar_number.isdigit() or len(aadhaar_number) != 12:
      return False
    d_table= gen_d_table()
    p_table=gen_p_table()
    p_len =len(p_table)
    previous_result = 0

    for index, digit_char in enumerate(reversed(aadhaar_number)):
      digit = int(digit_char)
      p_index = index % p_len
      current_digit = p_table[p_index][digit]
      previous_result=d_table[previous_result][current_digit]


    return previous_result == 0


# Example Usage
print(is_valid_aadhaar("279630292004")) # Output: True
print(is_valid_aadhaar("279630292005"))  # Output: False
print(is_valid_aadhaar("123456789012"))  # Output: False
print(is_valid_aadhaar("1234567890123"))  # Output: False

此方案确保 Aadhaar 号码通过基本的格式和 Verhoeff 校验。

额外的安全建议

  • 避免直接存储 Aadhaar 号码: 在必要情况下,对敏感信息进行加密或者使用脱敏技术,减少隐私风险。
  • 安全传输: 使用 HTTPS 加密数据传输通道,确保信息安全。
  • 多因素验证: 将 Aadhaar 号码验证与其他身份验证方式(比如手机验证码)结合使用。

总之,对Aadhaar号码进行验证需要在格式检查的基础上应用复杂的校验逻辑。 综合运用正则校验和算法验证可以创建一个健壮的验证系统,有效减少因数据错误可能导致的问题, 也能有效增加应用程序的安全性和可靠性。