首先将我在项目中遇到的坑挖出来。在我们的项目中有这样的一个需求就是对于用户的身份证号在数据库中存储的时候不能是明文存储。鉴于这样的一个需求,很自然的我们就想到了用base64编码将身份证号进行编码然后存入数据库中。
经过上面的处理本来以为就没有什么问题了,但是由于我们对base64编码的编码原理并不是很了解,所以就导致我们在接下来的开发过程中掉进了一个我们自己给自己挖的坑中去了。新的需求是这样的:可以通过身份证号的后4位或者后6位模糊查询出用户信息,当然也可以通过完整的身份证号将这个用户的信息查找出来。通过完整的身份证号进行检索当然很容易实现,直接将输入的身份证号也进行base64编码然后去数据库中查找即可。|
然而对于身份证号的后4位或者6位编码之后再去数据表中通过like关键字匹配是否可行呢?当然我们开始也是这样去做的。我们想当然的认为,完整的身份证号base64编码之后的字串包含其后4位或者6位base64编码的字串。比如说先编码一个身份证号:
echo base64_encode('153933199401281934');
// output --- MTUzOTMzMTk5NDAxMjgxOTM0
然后对其后6位编码
echo base64_encode('281934');
// output --- MjgxOTM0j
看到结果和预想的一样。所以马上就很开心的用like去匹配了。但是当编码后4位的时候却发现结果出现了异常
echo base64_encode('1934');
// output --- MtkzNA==
在完整的身份证号的base64编码字串中并没有包含后四位的编码字串。那就说明直接使用like去匹配还是行不通的。
这时觉得还是有必要去了解一下base64到底是如何