余额和核心信息数据安全分享
1.背景
在日常系统开发和实际运营中,出现过用户隐私信息(手机、身份证号、姓名、邮箱、qq)等信息数据的泄漏、余额数据篡改,通常有以下两种问题:
A、数据库被黑客攻击导致数据库泄漏、篡改、删除。黑客要求给比特币的情况居多。
B、内部人员的泄漏。包括数据泄漏、数据篡改。请不要怀疑,出现的太多了。
以上两种情况,具体是怎么泄漏的,看官们望不要抬杠。世界上没有安全的系统,有的只是破解难度大小的系统,本文只讨论如何尽可能减小损失。
2.通常做法
(一)信息加密防泄漏
数据加密常见算法有AES/DES/RSA等。
1.在实战项目中经常使用的算法是AES,将加密秘钥采取配置文件方式保存,或采取编码方式使用数据本身进行打码混淆方式,不需配置。这种较为常见。
2.通常核心关键数据要防止运维人员能获取配置文件、能获取源代码的这两种极端情况。这个时候可以采取配置文件模式+秘钥库方式,双结合。所谓秘钥库即单独部署一个应用服务,通过算法实时获取另一半秘钥。
以上两种方式实现起来成本低,建议使用第二种方式。
举例说明:
通常我们会在MySQL数据库里面,有一张会员表,会存储会员的手机、身份证号、姓名、邮箱、qq、微信等关键数据。
根据业务情况,可以将以上数据以json格式构建为一个完整的字符串进行加密保存。
如果有使用到以上信息进行sql查询的,通常则会使用独立的字段存储以上信息,则只能单个字段分别加密,存储。检索时通过算法先计算加密结果进行搜索。
通过加密后的信息,不管数据以什么方式泄漏,则都不会造成较大损失。当然如果信息解密难度较低,则信息破解后最终还是会造成损失。
(二)信息加签防篡改
防篡改通常指的是信息不能被修改。即使泄漏也无妨。这类数据就是余额了。通常每个系统都会涉及到金额、余额、账变、报表、汇率、指数、订单表等数据。为什么说账变和报表也有呢?
假设账变数据、报表数据、订单数据会作为二次使用(统计查询等),那么即使数据已生成、保存,如果被修改,则同样会导致二次损失。当然余额数据是最直接的了。比如你的某个会员有余额1000块,如果被篡改为10000,甚至加几个0,这个损失就相当大了。
当然不只有以上金额类信息被篡改的可能。本人曾经有个系统被黑客将银行卡和账户名改成了某个人,导致会员提款,造成重大直接损失。
防止信息被篡改,无非就是加签,给数据加个签名。加签通常有MD5签名或RSA签名。MD5签名算法通常需要加盐值+嵌套基层MD5(MD5)方式以确保签名足够复杂。
加签后,每次在使用数据之前做一次签名校验,如果签名被破坏则(或签名值置空)直接告警。比如余额数据加签后再每次使用查询、更新之前校验一遍签名。每次校验这种方式通常比较保守,代码侵入性较大,同时对于老旧数据(长期未使用)的篡改很难及时发现,下面介绍更通用的做法。
3.安全检测
对于信息篡改的检测告警,通常做法是使用binlog方式监控关键数据,如有变动,进行采集和校验。
本人常用的检测方式有Maxwell+kafka方式,对某些关键表进行监听,采集写入kafka。kafka消费时对数据进行验证签名、告警。此种方式无论是日常都有使用的,还是历史数据,只要变动就能发现异常。
4.结语
互联网世界千变万化,根据系统体量、价值,势必引来更多好事者。黑客、竞争对手,内部人员都是需要防范的对象。当然大公司大系统,在管理制度和权限分配上会有更严格和细化的方式。本文描述的是在实战中遇到的问题及解决方案进行描述。看官们如果觉得本文对自己有启发可点赞,谢谢~~
评论