1.3.3 eduID

背景

基于上海教育信息化的顶层设计,上海教育认证中心将对接大量的,来自不同领域的第三方应用。而教育服务号将成为这些第三方应用识别跨子域,跨学段用户的重要关联ID,是实现一号串联的重要基础。

由于跨子域的身份关联,本质上是自然人身份的关联,因此关联ID必然也要根据用户的自然人身份属性产生。虽然身份证号码很好的体现了用户的自然人身份属性,但是随着隐私安全保护的加强,直接通过交换身份证号码来关联用户身份已经显得不合时宜。因此身份证号码只能作为一个用户可选的属性,在经过用户授权的前提下提供给应用方。而身份关联必然要使用一个经过脱敏的,无用户隐私信息的ID来进行实现。

为了确保身份证信息在产生ID的过程中,也不会发生泄漏。ID的生成必须完全离线产生,即上海教育服务号关联ID的生成只与身份证号码与脱敏算法有关,与提供上海教育服务号的任何第三方都无任何关系。由此可以保证产生的上海教育服务号关联ID完全脱敏,最大程度的保护用户的隐私安全。

算法

由于上海教育服务号关联ID需要离线产生,因此脱敏算法决定的该关联ID的健壮性和易用性。我们遵循RFC4412国际标准,采用UUID version5 所规定的 UUID 生成算法,在身份证号码基础上予以脱敏。

UUID全称是Universally Unique Identifier,即通用唯一识别码。它由一组32位数的16进制数字所构成,以连字号分为五段,形式为8-4-4-4-12的32个字符,如:550e8400-e29b-41d4-a716-446655440000。

UUID能够让分布式系统中的所有元素都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建全局唯一,不与其它人冲突的UUID。

UUID 经过多次演化,目前由5个版本。

  • V1 基于时间 通过当前时间戳、机器 MAC 地址生成,因为 MAC 地址是全球唯一的,从而间接的可以保证 UUID 全球唯一。
  • V2 DCE安全 和基于时间的 UUID 算法相同,但会把时间戳的前 4 位置换为 POSIX 的 UID 或 GID,不过这个版本在 UUID 规范中没有明确指定,基本没有实际应用。
  • V3 基于命名空间(MD5) 由用户指定一个命名空间和一个具体的字符串,然后通过 MD5 散列来生成 UUID 。这个版本主要是是为了向后兼容,通常建议使用基于SHA1散列的V5版本,也就是我们上海教育服务号关联ID所使用的版本。。
  • V4 基于随机数 根据随机数或者伪随机数生成 UUID。
  • V5 基于命名空间(sha1) 和版本 3 类似,不过散列函数换成了 SHA1 。上海教育服务号关联ID所使用的版本。

上海教育服务号关联ID使用UUID V5版生成,能够保证身份证号与UUID的唯一对应关系,且无法被逆向解密。为了保障上海教育服务号关联的ID的全球唯一性,我们使用特定的命名空间来生成上海教育服务号关联ID。 首先使用RFC4412所预设的 NameSpace_DNS(即 6ba7b810-9dad-11d1-80b4-00c04fd430c8)作为命名空间,对 “sh.edu.cn” 进行 UUID V5 计算 产生新的命名空间 UUID(即 b22e8988-6d15-5bff-b3a6-8e85a8a79f37)。

然后将该UUID作为生成教育服务号管理ID的命名空间,对身份证号进行UUID V5计算,产生教育服务号关联ID。Python 的示例代码如下:

# -*- coding: utf-8 -*-
import uuid

def GenerateShanghaiEduID(IdNumber):
    ShanghaiEduDomain = "sh.edu.cn"
    eduidNameSpace = uuid.uuid5(uuid.NAMESPACE_DNS, ShanghaiEduDomain)
    return uuid.uuid5(eduidNameSpace, IdNumber)

if __name__ == '__main__':
    print(GenerateShanghaiEduID("110101200101016874"))

SDK

由于 UUID 是标准算法,因此各种编程语言都有现成的代码库可供调用,实现上非常方便。上海教育认证中心也提供了各种语言的示例代码和封装,和调试用的工具。

详见:https://github.com/shanghai-edu/eduid

其他地区的类似方案

其他地区亦有类似的实现方案,如 swissEduID

results matching ""

    No results matching ""