V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
teli
V2EX  ›  信息安全

怎么在数据库存敏感数据?

  •  1
     
  •   teli · 2022-12-27 08:48:59 +08:00 via Android · 6610 次点击
    这是一个创建于 457 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需要在数据库存用户身份证号码和手机号码。 最简单的方式,配置或者代码里一个固定的的密钥,每次对称加解密,数据库存密文。问题是密钥泄露风险。

    第 1 条附言  ·  2022-12-28 21:48:39 +08:00
    目前的解决方案是:
    存一份摘要、一份明文、一个密钥索引。
    摘要够用的时候,都用摘要。
    根据密钥索引可以找到密钥。新数据的密钥定期更换。密钥索引和密钥放配置里。
    36 条回复    2022-12-27 16:56:27 +08:00
    K1W1
        1
    K1W1  
       2022-12-27 08:56:45 +08:00   ❤️ 3
    密钥不要放在代码里,放在配置中心,远程拉取。没有配置中心,放在启动参数里。光密钥泄露没事,数据库泄露也没事,代码泄露也没事。要三者同时泄露才会出问题。
    teli
        2
    teli  
    OP
       2022-12-27 08:59:43 +08:00 via Android
    @K1W1 确定全局用同一个密钥 ok ?
    teli
        3
    teli  
    OP
       2022-12-27 09:02:49 +08:00 via Android
    @K1W1 我设想过
    每个数据再生成一个随机 key ,随机 key 和密文一起存,全局密钥加这个随机 key ,组成加解密钥。这个是否有必要?
    q1angch0u
        4
    q1angch0u  
       2022-12-27 09:06:01 +08:00 via iPhone
    @teli #3 如此做的话,“全局密钥”泄漏了,数据应该也就算泄漏了吧?
    Mogugugugu
        5
    Mogugugugu  
       2022-12-27 09:09:53 +08:00   ❤️ 3
    不建议存储加密 /明文身份证号,如果不是业务强要求,建议使用 hash 之后存储,可以存储一份脱敏的数据,例如只有后三位,满足部分搜索的需求。

    手机号可以做成加密存储,秘钥不要存在数据库里面,尽量避免数据库泄露全盘皆输的可能。

    另外不知道你们是什么机构,对于信息存储是否有一定的要求,如果是面向国内的特殊单位,参考 GB/T 35273-2020 的要求,该分开分开,不要听着产品经理的一股脑的都存进去,有些东西不是技术能解决的。
    Mogugugugu
        6
    Mogugugugu  
       2022-12-27 09:11:42 +08:00
    哦对、如果确实有明文存储需求的,可以看看硬件加密机。
    teli
        7
    teli  
    OP
       2022-12-27 09:14:28 +08:00 via Android
    @Mogugugugu 因为还要取出来使用。
    比方说,收货地址里的手机号码,就得存吧?
    billgong
        8
    billgong  
       2022-12-27 09:19:34 +08:00
    或者你可以为对应的数据加 salt ,甚至系统中设置多个 salt ,基本上就能做到楼上上说的必须泄漏三者才会出问题:
    - 主密钥( env )
    - 应用配置 secret 或 salt ( code )
    - 主密钥、应用的 salt 和记录 /用户的 salt 参与数据库中数据加密( db )

    对称加密可能还会用到 IV 和 nonce ,但 nonce 一般不需要记录(也不应该被复用),IV 保存在密文的开头或结尾是基本操作,在这个问题中不适用。
    Mogugugugu
        9
    Mogugugugu  
       2022-12-27 09:20:38 +08:00
    @teli 手机号这个确实无解,使用太广泛了,单纯的为了手机号上一套加密设备也没必要。但是还是参考楼上 1L 的回复,把秘钥和数据分开存储,降低风险,同时不要存储身份证号明文 /密文。
    realpg
        10
    realpg  
       2022-12-27 09:20:39 +08:00
    明文存就够了
    代码都是自己写的 个人知道自己代码质量 书写注意 无漏洞无 bug 就不用搞那些没用的保险
    billgong
        11
    billgong  
       2022-12-27 09:22:05 +08:00
    补充一点,如果使用了应用的 secret 那么这个 secret 丢失的话数据库里的数据可能就无法解密了(但可以备份这个 secret )。这种 secret 用来加密 volatile 数据更合适(比如 session key 之类需要加密但丢了也无妨的数据)
    danieladu
        12
    danieladu  
       2022-12-27 09:25:37 +08:00
    key 肯定不在 code 里面,需要专业的 keyvault 去处理这种事情,各大云服务都有类似的服务。
    这些 key 都有过期时间,会定时 rotation ,具体的策略取决于业务需求
    crd57
        13
    crd57  
       2022-12-27 09:30:34 +08:00
    拼多多应该是通过地址+手机号前三位+后四位进行存储的,因为我的手机号和我老婆的除了中间四位的不一致,别的都一直,地址也一致,我俩的物流信息老是串的(个人猜测是这样)
    kenberkeley
        14
    kenberkeley  
       2022-12-27 09:31:16 +08:00 via iPhone   ❤️ 1
    AWS KMS
    cedoo22
        15
    cedoo22  
       2022-12-27 09:40:35 +08:00
    加密做成单独的服务,独立出来,
    除非 服务代码 + 秘钥 + 数据库 同时泄露, 单独一个、两个泄露 都不怕
    himarrin
        16
    himarrin  
       2022-12-27 09:46:50 +08:00
    手机号不存第一位 身份证号不存第七位
    Morii
        17
    Morii  
       2022-12-27 10:14:20 +08:00
    @realpg #10

    现在国家不允许明文存储隐私信息额,至少我所在的游戏行业定期审查这个。
    wu67
        18
    wu67  
       2022-12-27 10:26:24 +08:00   ❤️ 6
    手机号还行, 身份证和真实姓名还是得加密, 至少不应该明文存.
    另外真的很想给#10 点踩. 足球还有守门员呢, 照样能进球, 还代码质量无 bug, 是个人写的代码就会出 bug 的可能, 是个框架就有漏洞风险, 除非你写的系统不联网, 纯线下设备使用, 但就算如此, 硬件淘汰、更新换代时和人员管理不过关时, 纯线下设备一样有泄露数据的风险
    solitude2
        19
    solitude2  
       2022-12-27 10:31:35 +08:00
    信封加密
    没有绝对安全,只能提高攻击者破解成本
    可以了解下密码学相关的
    samin
        20
    samin  
       2022-12-27 10:39:02 +08:00
    @Morii 所以游戏行业里面 都是如何去做密文存储 ?
    mengzhuo
        21
    mengzhuo  
       2022-12-27 10:51:05 +08:00   ❤️ 1
    这是都没有学习过隐私保护么?这玩意 2021.11.1 都立法了……
    身份证和手机号能不存就不存,哈希算是假名化,还是个人数据,需要加密处理(根密钥需要单独配置在配置中心、每个用户可以通过根密钥省成对应工作密钥),而且最好是单独找个库来放。

    注:敏感数据哈希要用 pbkdf2 ,而不是简单的盐和算法。
    realrojeralone
        22
    realrojeralone  
       2022-12-27 10:51:13 +08:00
    #10 是小白吗?没有任何安全意识,可能根本没有关注过漏洞报告,不知道啥叫 0day
    ttimasdf
        23
    ttimasdf  
       2022-12-27 11:19:34 +08:00
    @realpg 哈哈我们就靠你们这种程序员吃饭呢。

    #10 这个方案不错,建议立法,全国推广。
    Morii
        24
    Morii  
       2022-12-27 11:19:43 +08:00
    @samin #20

    也是楼上说的方案,每个服务一组密钥,对外暴露的 API 只返回脱敏的数据,落地的数据均加密处理,需要解密获取原始数据时需要记录行为日志。
    bthulu
        25
    bthulu  
       2022-12-27 11:27:37 +08:00
    BASE64 转一下就行了, 既满足法规, 又简单易懂, 至于数据泄露, 别想太多, 早点干完早点下班
    qeqv
        26
    qeqv  
       2022-12-27 13:14:23 +08:00
    @mengzhuo 为啥哈希还要加密
    dengji85
        27
    dengji85  
       2022-12-27 13:22:27 +08:00
    唉,楼上都是大厂的,向我这种底层螺丝工数据库就是明文,代码层简单脱敏
    EminemW
        28
    EminemW  
       2022-12-27 13:51:53 +08:00
    @dengji85 #27 被人举报一下,相关部门就会来监督你改造数据库了🤪
    liuidetmks
        29
    liuidetmks  
       2022-12-27 14:20:56 +08:00
    @realpg 有的公司有代码审计,尤其是你有上市这个需求
    Maboroshii
        30
    Maboroshii  
       2022-12-27 14:28:43 +08:00
    法务要求你怎么存就怎么存,不要求就存明文。 毕竟这不是一个技术问题
    xyjincan
        31
    xyjincan  
       2022-12-27 15:59:11 +08:00
    号码存在独立的 redis 服务器上呢
    armyHcz
        32
    armyHcz  
       2022-12-27 16:07:30 +08:00
    @himarrin 天才啊
    swulling
        33
    swulling  
       2022-12-27 16:19:47 +08:00 via iPhone
    简单 aes 加密一下保存就行了,密钥放到配置里。

    你说配置泄漏?满足法律要求就行,泄漏就泄漏呗。
    nic0Y
        34
    nic0Y  
       2022-12-27 16:47:49 +08:00
    @himarrin 手机号如果只限制在国内倒还好说,拿身份证如果是 2000 年以后出生的呢?
    himarrin
        35
    himarrin  
       2022-12-27 16:55:41 +08:00
    @nic0Y 1 跟 2 还是还是可以通过后面几位判断的
    ZSeptember
        36
    ZSeptember  
       2022-12-27 16:56:27 +08:00   ❤️ 1
    看过美团的一篇文章 https://tech.meituan.com/2022/09/22/token-pii.html
    可以参考下,不过没说源信息如何存储,我理解也是数据库加密,然后有个解密服务
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1530 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:05 · PVG 01:05 · LAX 10:05 · JFK 13:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.