当前位置: 首页 > 后端技术 > Java

GrowingIO数据安全实践

时间:2023-04-01 20:13:05 Java

什么是数据安全?确保状态的能力。为什么企业需要数据安全?在互联网普及的今天,不法分子可以通过网络攻击、网络欺骗等方式窃取用户的个人信息甚至企业机密信息。而且,在获取到一些用户信息后,可以对特定的人进行唯一锁定,所以数据的保密性就显得尤为重要。GrowingIO数据安全落地为了保证客户数据的安全,GrowingIO通过构建安全的软件运行时和数据静态存储加密,提高了数据生产的安全性。下面详细介绍数据安全落地的流程。软件运行安全软件运行安全是企业的系统运行安全,主要包括两个方面:数据逻辑隔离:系统通过用户权限和角色提供一套专有的数据操作。KMS密钥管理:系统依赖的数据库,中间件不会因为密钥泄露而导致数据泄露。数据逻辑隔离数据逻辑隔离主要是对平台操作用户的身份、角色、权限进行认证。认证流程:通过RBAC权限模型,为所有平台的用户分配不同的角色和权限。只有具有相应角色权限的用户才能查看或执行相应的操作。KMS密钥管理KMS(keymanagementsystem)密钥管理系统。目前亚马逊云、阿里云等云产品都有自己的解决方案。KMS支持各类数据库、中间件、应用密钥管理功能。使用KMS后,所有数据库、中间件等的用户名和密码对产研所都是不可见的,静态数据加密应用对应的秘钥也是不可见的。目前支持数据库、中间件和系统秘钥:【交互过程】【示例展示】以亚马逊云(AWS)为例:应用配置kms:enabled:falseaws:region:""access_key_id:""secret_access_key:""#在应用中添加spring:redis:kms-key:"test/json/redis"datasource:kms-key:"test/postgresql/accounts"运行初始化示例以postgresql数据库HikariCP连接池为例:@Bean@ConditionalOnProperty(value="kms.enabled",havingValue="true")publicHikariDataSourcedataSource(DataSourcePropertiesproperties,KmsPropertieskms,Configsconfigs){SecretsManagerClientclient=SecretsManagerClientBuilder.build(kms.getRegion(),kms.getAwsAccessKeyId(),kms.getAws(键));AwsSecretProvidersecretProvider=newAwsSecretProvider(客户端);字符串秘密;试试{secret=secretProvider.getSecret(configs.getDataSourceKmsKey());//secret是json格式的链接信息finalHashMapmap=Jackson.readValue(secret,HashMap.class);Stringurl=String.format("jdbc:postgresql://%s:%s/%s?useUnicode=true&useSSL=false&characterEncoding=utf8",map.get("host"),map.get("port"),map.get("dbname"));properties.setUrl(url);properties.setUsername(map.get("username"));properties.setPassword(map.get("password"));}catch(Exceptione){log.error("kmsdatabaseerror",e);}HikariDataSourcedataSource=属性。initializeDataSourceBuilder().type(HikariDataSource.class).build();if(StringUtils.hasText(properties.getName())){dataSource.setPoolName(properties.getName());}returndataSource;}在实际开发中使用Any数据库和中间件可以通过KMS管理相应的用户名、密码等敏感信息静态存储安全PII管理【WhatisPII】PII是个人身份信息(Personallyidentifiableinformation)是任何可以识别特定个人身份的数据...任何可用于区分一个人与另一个人以及可用于对先前匿名的数据进行去匿名化的信息都可以被视为PII。PII可以单独使用或与其他相关数据一起使用来识别个人,并且包含可以唯一识别个人的直接标识符(例如护照信息)或准标识符(例如种族),并且可以与其他准标识符结合使用-标识符,例如出生日期,以成功识别个人。【PII含义】保护PII对于个人隐私、数据隐私、数据保护、信息隐私和信息安全至关重要。窃贼只需一小部分个人信息,就可以以该人的名义创建虚假账户、产生债务、伪造护照或将个人身份出售给罪犯。随着个人的个人数据每天都被记录、跟踪和使用——例如在使用指纹的生物识别扫描和用于解锁设备的面部识别系统中——保护个人身份和他们独有的任何识别信息变得越来越重要。更重要。【PII加密解密】PII加密:使用加密算法对数据库中存储的所有敏感数据进行加密。PII解密:普通用户只能查看加密后的密文数据,有业务需求的用户可通过授权查看明文数据。GrowingIO默认选择AES(AES/CBC/PKCS5Padding)算法,使用256长度的秘钥作为PII数据加密的实现。执行过程数据加密数据解密举例说明PII可以从配置中心或KMS获取加解密所需的密钥数据。秘钥获取://KMS方式SecretsManagerClientclient=SecretsManagerClientBuilder.build(kms.getRegion(),kms.getAwsAccessKeyId(),kms.getAwsSecretAccessKey());AwsSecretProvidersecretProvider=newAwsSecretProvider(client);Stringsecret=secretProvider(."test/pii/json");//secret为json格式的链接信息finalHashMapmap=Jackson.readValue(secret,HashMap.class);StringalgorithmIv=map.getOrElse("algorithm_iv","");//向量Stringiv=DatatypeConverter.parseHexBinary(algorithmIv);//密钥StringencryptionKey=DatatypeConverter.parseHexBinary(map("encryption_key"));StringdecryptionKey=DatatypeConverter.parseHexBinary(map("decryption_key"));//配置中心模式//VectorStringiv=Hex.decodeHex(Configs.Encry.configCenterIv);//秘钥Stringsecret=Hex.decodeHex(Configs.Encry.configCenterSecret);执行加密或解密操作:数据经过PII处理后,数据库中的所有敏感数据都被加密存储。页面渲染根据用户权限判断是否加密或解密显示。数据存储和渲染数据库数据:只有管理员登录才能渲染解密数据:FAQ1.VectorIVsupportAES加密算法中:AES_ECB_PKCS5Padding不支持vectors,AES_CBC_PKCS5Padding支持vectors,更安全。如果已经使用原来的AES算法,要考虑兼容性。2、Base64编码带来的问题现象:如果加密字符串比较长,加密后的密文长度超过76,会在密文中加入换行符,导致逐行解析异常。JDK1.8之后,Base64工具类被移到java.util包中。为了兼容低版本的JDK,采用了Base64的MimeEncode:privatestaticfinalintMIMELINEMAX=76;privatestaticfinalbyte[]CRLF=newbyte[]{'\r','\n'};静态最终编码器RFC2045=新编码器(假,CRLF,MIMELINEMAX,真);也就是说,当加密后的字符串长度超过76个'\n'时,会加上'\r',如果对数据进行一些按行的操作,就会出现致命错误。所以推荐使用Base64的Encode实现:staticfinalEncoderRFC4648=newEncoder(false,null,-1,true);静态最终编码器RFC4648_URLSAFE=新编码器(真,空,-1,真);这样无论加密后的字符串有多长,都不会出现换行问题。参考JDK源代码和关键标准:RFC4648http://www.ietf.org/rfc/rfc46...RFC2045http://www.ietf.org/rfc/rfc20...