Skip to content

Latest commit

 

History

History
302 lines (238 loc) · 9.47 KB

README.md

File metadata and controls

302 lines (238 loc) · 9.47 KB

id-validator Java版本

中华人民共和国居民身份证中华人民共和国港澳居民居住证以及中华人民共和国台湾居民居住证号码验证工具(Java 版)支持 15 位与 18 位号码。 S版)

Chinese Mainland Personal ID Card Validation

996.icu

感谢

jxlwqq

引入

  <dependency>
    <groupId>io.github.Feiyizhan</groupId>
    <artifactId>id-validator</artifactId>
    <version>1.8</version>
  </dependency>

验证身份证号合法性

验证身份证号是否合法,合法返回 true,不合法返回 false

验证地区编号

不推荐使用,因为国内的地区编号一直在变,而且找不到一个当前最新最完整的地区编码库。

public class IdCardUtilsTests {

    @Test
    public void testValidIdCard(){
        Assert.assertTrue(IdCardUtils.isValid("13053519860730352X"));
    }
}

不验证地区编号

    @Test
    public void testValidIdCardWithDoNotVerifyRegionCode(){
        Assert.assertTrue(IdCardUtils.isValidWithDoNotVerifyRegionCode("130223198605246136"));
        Assert.assertFalse(IdCardUtils.isValid("440301199508290949"));
        Assert.assertTrue(IdCardUtils.isValidWithDoNotVerifyRegionCode("440301199508290949"));
    }

获取身份证号信息

    @Test
    public void testGetIdCardInfo(){
        System.out.println(IdCardUtils.getIdCardInfo("13053519860730352X"));
    }

返回结果:

public class IdCardInfo {

    /**
     * 区域编码
     */
    private String zoneCode;

    /**
     * 地址码是否废弃,1 为废弃的,0 为正在使用的
     */
    private Boolean abandoned;

    /**
     * 地址,例如:广东省深圳市盐田区
     */
    private String address;

    /**
     * 省市区三级列表,例如: ["广东省", "深圳市", "盐田区"]
     */
    private List<String> addressList;

    /**
     * 出生日期,格式:yyyy-MM-dd,例如:1999-01-10
     */
    private String birthday;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 星座,例如:水瓶座
     */
    private String constellation;

    /**
     * 生肖,例如: 卯兔
     */
    private String chineseZodiac;

    /**
     * 性别,1 为男性,0 为女性
     */
    private Integer sex;

    /**
     * 号码长度, 15或18位
     */
    private Integer length;

    /**
     * 校验码
     */
    private String checkBit;

}

注:判断地址码是否废弃的依据是中华人民共和国行政区划代码历史数据集,本数据集的采集源来自:中华人民共和国民政部,每年更新一次。本数据集采用 csv 格式存储,方便大家进行数据分析或者开发其他语言的版本。

生成可通过校验的假数据

伪造符合校验的身份证: 参数说明:

  • is18Bit 是否生成 18 位号码,默认为true,false生成15位号码;

  • address 地址,即省市县三级地区官方全称,如北京市、台湾省、香港特别行政区、深圳市、黄浦区等, 可以只提供省或者市,将会取省或市下随机的区县,默认或参数非法,则生成合法的随机地址;

  • year 出生日期-年,合法的值为1900本年,默认或参数非法,则随机取1900本年的年;

  • month 出生日期-月,合法的值为1-12,默认或参数非法,则随机取112的月; 如果是随机到的或指定的年份为本年,则随机取1本月的月。

  • day 出生日期-日,合法的值为1-31, 默认或参数非法,则随机取1~31的日;

  1. 如果随机到年月为本年月,且如果指定的日大于当天,则随机取1~当天的日;
  2. 如果随机到的年月不是本年月,且如果指定的日大于所在月的最后一天,则随机取1~所在月的最后一天的日;
  3. 否则使用指定的日;
  • sex 性别,1为男,0为女,默认或参数非法,则生成合法的随机性别;
@Test
    public void TestFakeId(){
        //测试完全随机
        for(int i=0;i<10;i++){
            String newIdCard = IdCardUtils.fakeId(null,null,null,null,null,null);
            System.out.println(newIdCard);
            System.out.println(IdCardUtils.getIdCardInfo(newIdCard));
        }

    }

    @Test
    public void TestFakeIdWith15Bit(){
        //测试随机生成15位
        for(int i=0;i<10;i++){
            String newIdCard = IdCardUtils.fakeId(false,null,null,null,null,null);
            System.out.println(newIdCard);
            System.out.println(IdCardUtils.getIdCardInfo(newIdCard));
        }
    }

    @Test
    public void TestFakeIdWithProvince(){
        //测试随机生成指定省的
        for(int i=0;i<10;i++){
            String newIdCard = IdCardUtils.fakeId(true,"广东省",null,null,null,null);
            System.out.println(newIdCard);
            System.out.println(IdCardUtils.getIdCardInfo(newIdCard));
        }
        //测试随机生成指定直辖市的
        for(int i=0;i<10;i++){
            String newIdCard = IdCardUtils.fakeId(true,"上海市",null,null,null,null);
            System.out.println(newIdCard);
            System.out.println(IdCardUtils.getIdCardInfo(newIdCard));
        }
        //测试随机生成指定台湾
        for(int i=0;i<10;i++){
            String newIdCard = IdCardUtils.fakeId(true,"台湾省",null,null,null,null);
            System.out.println(newIdCard);
            System.out.println(IdCardUtils.getIdCardInfo(newIdCard));
        }
    }

    @Test
    public void TestFakeIdWithCity(){
        //测试随机生成指定市的
        for(int i=0;i<10;i++){
            String newIdCard = IdCardUtils.fakeId(true,"宁波市",null,null,null,null);
            System.out.println(newIdCard);
            System.out.println(IdCardUtils.getIdCardInfo(newIdCard));
        }
    }
    @Test
    public void TestFakeIdWithCounty(){
        //测试随机生成指定直辖市区的
        for(int i=0;i<10;i++){
            String newIdCard = IdCardUtils.fakeId(true,"静安区",null,null,null,null);
            System.out.println(newIdCard);
            System.out.println(IdCardUtils.getIdCardInfo(newIdCard));
        }

        //测试随机生成指定县的
        for(int i=0;i<10;i++){
            String newIdCard = IdCardUtils.fakeId(true,"新丰县",null,null,null,null);
            System.out.println(newIdCard);
            System.out.println(IdCardUtils.getIdCardInfo(newIdCard));
        }
    }

    @Test
    public void TestFakeIdWithYear(){
        //测试随机生成指定直辖市区的
        for(int i=0;i<10;i++){
            String newIdCard = IdCardUtils.fakeId(true,"静安区",2019,null,null,null);
            System.out.println(newIdCard);
            System.out.println(IdCardUtils.getIdCardInfo(newIdCard));
        }
    }

    @Test
    public void TestFakeIdWithMonth(){
        //测试随机生成指定直辖市区的
        for(int i=0;i<10;i++){
            String newIdCard = IdCardUtils.fakeId(true,"静安区",2019,2,null,null);
            System.out.println(newIdCard);
            System.out.println(IdCardUtils.getIdCardInfo(newIdCard));
        }
    }

    @Test
    public void TestFakeIdWithDay(){
        //测试随机生成指定直辖市区的
        for(int i=0;i<10;i++){
            String newIdCard = IdCardUtils.fakeId(true,"静安区",2019,3,15,null);
            System.out.println(newIdCard);
            System.out.println(IdCardUtils.getIdCardInfo(newIdCard));
        }
    }

    @Test
    public void TestFakeIdWithSex(){
        //测试随机生成指定直辖市区的男性
        for(int i=0;i<10;i++){
            String newIdCard = IdCardUtils.fakeId(true,"静安区",2019,3,15,1);
            System.out.println(newIdCard);
            System.out.println(IdCardUtils.getIdCardInfo(newIdCard));
        }
        //测试随机生成指定直辖市区的女性
        for(int i=0;i<10;i++){
            String newIdCard = IdCardUtils.fakeId(true,"静安区",2019,3,15,0);
            System.out.println(newIdCard);
            System.out.println(IdCardUtils.getIdCardInfo(newIdCard));
        }
    }

升级身份证号码

15 位号码升级为 18 位:

 @Test
    public void testUpgradeId(){
        System.out.println(IdCardUtils.getIdCardInfo("610104620927690"));
        String newIdCard = IdCardUtils.upgradeId("610104620927690");
        System.out.println(newIdCard);
        System.out.println(IdCardUtils.getIdCardInfo(newIdCard));

    }

参考资料

License

MIT