【敏感数据识别】银行卡号校验实现(准确率高)
一、常见银行卡号校验实现
银行卡号正则:^([4-6]{1})(\d{15}|\d{18})$ + luhm校验位
缺点:易与编号碰撞
二、解决办法
正则 + luhm校验位 + 卡bin + 银行卡长度
银行卡号由发卡行标识(即卡bin)+发卡行自定位+校验位构成,其中卡BIN号(Bank Identification Number)即发卡银行标识代码的英文缩写,为银行卡号前6位,由中国银联负责向机构分配、确认和管理。
中国银行发卡步骤:
1、向银联申请卡bin
2、银联通过
3、银行发卡
三、卡bin获取难点
银联未公开卡bin数据,卡bin文件一月一更新,仅支持企业身份申请卡bin文件。通过申请后,银联会将卡bin文件发送给企业邮箱。
卡bin文件中包含每一卡bin对应发卡行、银行卡号长度、卡片类型(借记卡、储蓄卡、信用卡等)、发卡行编码等信息。
所以,卡bin是只能以企业身份拿到的。如果你所在的公司有做支付的团队,那么在企业内部就已经从银联申请过卡bin文件了,找到自己公司的支付团队申请卡bin就行了。
四、代码实现
注:本文不提供卡bin文件,需自行寻找或向银联申请
public class BankCardUtil {
// bin -> 银行信息
private static final Map<String, BankCardBinInfo> BIN_TO_INFO_MAP = new HashMap<>();
// bin -> 银行卡长度
private static final Map<String, Integer> BIN_TO_LENGTH_MAP = new HashMap<>();
static {
InputStream inputStream = null;
try {
String path = "static/卡bin文件.xlsx";
inputStream = BankCardUtil.class.getClassLoader().getResourceAsStream(path);
ExcelReader reader = ExcelUtil.getReader(inputStream, "sheet1");
List<List<Object>> readAll = reader.read(