V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
longmeier90
V2EX  ›  程序员

我要设计一个 saas 系统,怎么设计一些敏感数据加密?

  •  
  •   longmeier90 · 34 天前 · 2214 次点击
    这是一个创建于 34 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ```
    我准备用 go 开发一个 saas 系统,里面设计到 [库房] -> [商品] -> [添加] 功能

    但是租户不愿意让我们知道他们的商品进货价,那么我怎么设计系统里面字段加密,让客户登录时自己看到。
    其他任何人包括软件提供商都不能看到。
    1.成熟的解决方案吗?

    ```
    38 条回复    2024-11-25 11:24:05 +08:00
    renmu
        1
    renmu  
       34 天前 via Android
    用户提供一个密钥,然后你用来加密
    zsj1029
        2
    zsj1029  
       34 天前
    商户不变且唯一的 id ,uuid 做 密钥,加密入库,数据查询后解密,返回前端显示
    chatgpt 可以问问
    tojike
        3
    tojike  
       34 天前
    不用理会客户的需求,告诉他我们已经帮你加密了。目前就你自己能看
    spectacle
        4
    spectacle  
       34 天前
    用户使用 pki rsa 证书绑定,公钥加密,私钥解密
    bagel
        5
    bagel  
       34 天前
    端到端加密呗,正确方式使用确实可以做到只有用户能看到明文数据,问题是你的这些所谓租户他们愿意牺牲便利吗?估计是些连强密码都不会设置的主。
    JKOR
        6
    JKOR  
       34 天前 via Android
    服务内置公钥,用户保存私钥。
    用户输入价格后公钥加密上传到数据库。
    获取价格时,用户输入私钥本地解密显示。

    这样只要程序没有后门,就只要用户能看到。
    dapang1221
        7
    dapang1221  
       34 天前
    伪需求,你直接告诉租户,里面的数据你们作为软件提供商是看不到的就行了,实际上你们(的运营)也确实看不到,这个概念很模糊。数据库里必须存明文,不然以后这个字段就废了,没法做任何计算和筛选
    bagel
        8
    bagel  
       34 天前
    @dapang1221 密文也可以计算,同态加密听说过没。总之技术方案有的是,问题在于 OP 的用户消受不起,连密码都不会设的主,你让 ta 管理端到端的密钥。
    flmn
        9
    flmn  
       34 天前
    如果提供商是恶意的,在加密入库之前,都是能拿到的呀。

    除非客户自己整一个算法,类似国内对地理坐标的处理,然后录到你这里,明文保存即可,客户从界面上看到后,用自己的算法解出来。明文只在客户的电脑/脑子里出现……

    所以,如果系统能卖上价,考虑下私有化部署?
    dapang1221
        10
    dapang1221  
       34 天前   ❤️ 2
    @bagel 啊?同态加密用在数据库字段?别谈密码学理论,给一个工程上的实现,现在 OP 需要一种加密方式,让这个字段加密存储,并且在常见的数据库,比如 mysql, postgresql, 哪怕 clickhouse 里面,实现简单的 where price > xxx 的查询。你来讲讲用密文怎么计算
    GeekGao
        11
    GeekGao  
       33 天前
    要看你们目前的基础架构方案,如果是一个租户一个数据库,那么整个库都可以做加密: 共享基建+完整的数据加密
    GeekGao
        12
    GeekGao  
       33 天前
    解密的时候在数据操作层进行。需要抽象出一套加密解密的体系的 DAO 。
    v2luoqg
        13
    v2luoqg  
       33 天前
    字段加密后所有的 sql 语法都基本废了,程序设计的方式也要变了吧。
    siweipancc
        14
    siweipancc  
       33 天前 via iPhone
    那用数据库干嘛,让他们用文本存储数据。
    Sunzehui
        15
    Sunzehui  
       33 天前
    让他们存数据的时候自己搞个公式存错的数据,查的时候他们自己按照自己公式倒推出来。不知道能不能行 😌
    realpg
        16
    realpg  
       33 天前
    @JKOR #6
    按价格降序排序怎么写?
    realpg
        17
    realpg  
       33 天前
    @dapang1221 #10
    where price > xxx
    加密后的 还是可以写的
    首先暂且将价格固定为分为单位的正整数

    然后可以设定一个纯缩放算法,将原始数值 与一个限定范围的正整数系数作为变量 通过一定公式进行缩放算法
    缩放算法 就是连续函数 f(x)在 x 为正整数时单调递增 且当 x 为正整数时 f(x)也是正整数
    这个函数中的一个或者多个变量,由客户自行初始化时设置 存储到另一套数据库存储

    同时,将商品基础信息描述,存储到另一套系统 实现数据库比照隔离
    M003
        18
    M003  
       33 天前   ❤️ 1
    伪需求吧. 加密完还得解密返回客户端. 这加密和解密方法都知道了啊.

    就告诉他们,我们是加密的. 公司运营和技术都是看不到的.有老板把自己关小黑屋写的加密程序. 无人可破解.
    最好让他们把供应商也录入进来,这样数据就值钱了.同类商品横向对比. 公司也可以做个二道贩子了.

    @zsj1029 如果录入的金额 100 ,加完密成了 xxx 乱码 .那查询金额为 50~150 的货物,咋查..
    sillydaddy
        19
    sillydaddy  
       33 天前
    @dapang1221 #10
    同态加密可以做筛选啊,不一定非得用数据库自带的 select 语句完成吧。可以把所有数据 select 下来,然后后端去筛选。
    全同态是可以做到所有的运算的。

    OP 的需求还是不太清晰,对于加密后的进货价,还要不要进行运算?如果要运算,需要哪些运算?
    如果仅仅是纯列表显示,那么前面几楼的方案最简单;
    如果仅需要对进货价格进行带系数的加法运算(例如求总进价),那么半同态加密( PHE )就可以做到,速度也能满足;
    如果需要对进货价格进行大小的比较,或者其他逻辑运算,可能要用到全同态加密( FHE ),速度会比正常运算慢百万倍,而且内存占用也超大。( 参考 /t/700927
    sillydaddy
        20
    sillydaddy  
       33 天前
    @realpg #17
    那如果是带系数求和( ax+by+cz ),这个缩放的方法就不行了,缩放必须是线性的才能满足求和之后可以反算回来,那也就失去了加密的意义了。
    realpg
        21
    realpg  
       32 天前
    @sillydaddy #20
    为啥要求和?
    什么系统什么场景会有商品上游渠道单价求和这个操作?
    realpg
        22
    realpg  
       32 天前
    @sillydaddy #20
    人家的需求就是 保密成本单价 让接触系统的人看不到 这是一个非常常见且合理的需求

    我都经手过很多个这个需求的系统开发 比如牙科系统的牙冠成本价 医生都知道 医院都知道 但是他们完全不希望给他们开发系统的开发商和运维商知道

    能不解密排序 能不解密比价 走索引 是基本要求

    而你说这种 ax+by+c 场景,你确定是要写在 SQL 里面进行计算的吗?什么场景会有这种要求?

    不都是取出来在程序侧计算,而程序侧是有解密的系数的 直接解开爱怎么加怎么加
    sillydaddy
        23
    sillydaddy  
       32 天前 via Android
    @realpg 如果仅仅是需要排序或者索引,那你说的方法当然可行。
    加总求和的操作,你怎么知道没有呢?求出某个商品在一段时间内的进货总价,不就是数量乘以价格,再加总吗?
    当然你可以说这个计算可以解密后放在前端进行,如果是这样,那前面几楼的方案也可以啊,计算都放前端,数据库只是起一个储存数据的作用。
    问题的根本就是,你不知道他有哪些计算的需求,你说的缩放,也仅仅能够起到排序这一个作用。
    realpg
        24
    realpg  
       32 天前
    @sillydaddy #23
    你就杠吧
    我都开发过多少套这种程序了
    你不要虚空跟我杠你所谓得哪些需求需要前端 哪些不需要前端

    假设一个系统内,有 100 万条商品信息,其中成本一项需要加密
    显而易见,你不能每次操作都把 100 万条商品信息全取出来让程序去排

    “按照成本排序并分页显示”
    “筛选成本在一定金额范围内的并分页显示”

    这是任何一个商城类系统都雷打不动的

    这个得实现只能带入 SQL 里面去 price BETWEEN 和 ORDER BY PRICE 否则你一次 100 万条都拿出来吗?
    这也是 OP 得需求

    请你给我举例一个你说的场景得刚性需求 如果你觉得这种不写入库内性能就够 咱来个 performance bench 实际测一下你的说法可行不可行


    都是搞技术的,talk is cheap, show me your code

    为了杠构造点东西骗骗外行也就罢了 别连自己都骗了
    sillydaddy
        25
    sillydaddy  
       32 天前 via Android
    @realpg 你要是我下属,我一定立马开除了你。没有任何根据的在那儿臆测。
    sillydaddy
        26
    sillydaddy  
       32 天前 via Android
    @realpg 需求不是你说了算,需求在 OP 那儿。你怎么知道商户有 100 万数据?你怎么知道全部 select 出来性能不够?你怎么知道没有加总的需求?就你这种不看需求就开发的,第一个开的就是你。
    realpg
        27
    realpg  
       32 天前
    @sillydaddy #26

    我很好奇,你一个月挣得估计都没我一个月就软件项目交的税多,哪来的勇气虚空开除我,梁静茹给你的勇气吗?
    sillydaddy
        28
    sillydaddy  
       32 天前
    @realpg
    你问我凭什么有勇气开除你,不凭别的,凭常识就够了。
    我一个月工资不高,也就 2 万,没你牛逼。你说我没经验,确实我连一个 saas 系统也没开发过。你开发的不是多吗,这么着,你从你做的那么多项目里面,找出来一个需要**按成本价**排序 100 万条数据的,我当场赔你 2 万。你要是找不出来,倒赔给我 2 万!
    真是吹牛逼不上税,还 100 万。
    realpg
        29
    realpg  
       32 天前
    @sillydaddy #28
    我现在做的就是啊 省医保 里面药品 器械 操作 加上品牌 加上特殊标志 加上商品名 单价成本价什么都得排序
    目前已经快上五百万条目了 因为里面还有各种加收项目 加收 1~n 还有各种限抢救 限病种不同分类

    而且操蛋的是 这不是国际通用商业数据库 必须是信创目录的 性能渣的一批
    realpg
        30
    realpg  
       32 天前
    @sillydaddy #28
    随便一个检查项目,发光法化学法电泳法酶免法全是一个独立条目 然后还有限不同病种的匹配关系
    只能说 你压根就没带领过大型项目 无知限制了你的想象力
    sillydaddy
        31
    sillydaddy  
       32 天前
    @realpg 别跟我扯哪些有的没的。我就问你敢不敢赌。
    你那 500 万条数据需要针对成本价排序的话,你把相应的需求发给我,我这就赔你 2 万。不同类型的器械有什么必要针对成本价排序,你会把苹果和梨子的价格排序吗?所以说识破你的鬼话不需要什么专业知识,有常识就足够了。
    YsHaNg
        32
    YsHaNg  
       31 天前 via iPhone
    @dapang1221 可以的 aws 最近在做 fhe db benchmark 你可以关注一下
    @Sunzehui
    Dlin
        33
    Dlin  
       31 天前
    评论区还能吃瓜
    xuanbg
        34
    xuanbg  
       31 天前
    我的疑问是:你一个库存,为啥要存成本价?如果是记账类的如管家婆,不可能对某个字段做加密处理。不能做条件查询不说,也完全没必要啊。你真要保密,多花点钱私有化部署就完了,或者自己招人开发也行。

    总之,这种客户就不是 SAAS 厂商的菜。找准自己的定位很重要,别为这些乱七八糟的特殊需求乱了自己的阵脚。
    xiaoheicat
        35
    xiaoheicat  
       31 天前 via iPhone
    做个 BFF 加密中间层啊,前端不变,后端不变。BFF 响应时做匿名化不就好了,如果想要当前账户能看,做个超时
    Desdemor
        36
    Desdemor  
       31 天前
    同意楼上 直接私有化部署算了 费那劲
    sbldehanhan
        37
    sbldehanhan  
       31 天前
    @tojike #3 我看刑。
    126ium
        38
    126ium  
       31 天前 via Android
    @Dlin 我已经把那 silly 什么的给 block 了,杠得不行。看了下过往记录,就是现实生活中很讨厌的一类人呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3534 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:44 · PVG 18:44 · LAX 02:44 · JFK 05:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.