余额和核心信息数据安全分享

发布于: 2020 年 12 月 21 日

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.结语



互联网世界千变万化,根据系统体量、价值,势必引来更多好事者。黑客、竞争对手,内部人员都是需要防范的对象。当然大公司大系统,在管理制度和权限分配上会有更严格和细化的方式。本文描述的是在实战中遇到的问题及解决方案进行描述。看官们如果觉得本文对自己有启发可点赞,谢谢~~



用户头像

还未添加个人签名 2018.01.23 加入

一个Java老程序员的工作和生活分享

评论

发布
暂无评论
余额和核心信息数据安全分享