V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xhatt510
V2EX  ›  程序员

逆天!干了 3 年的同事用 base64 编码做 token 并且把密码也放了进去

  •  1
     
  •   xhatt510 · 213 天前 · 25858 次点击
    这是一个创建于 213 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近做项目,他搞了用户登陆和状态保持。

    当时存的时候他跑过来问我密码要不要用 base64 加密存。
    我说这和明文没啥区别把,区别就是比明文多浪费1/3空间。不如直接加盐然后存 md5 。

    当我看到 token 的时候,我人直接傻了。

    这就是 token YWRtaW58cGFzczEyMzQ1NnwxNzEzNzcxNzg4

    我相信只要干过开发的人一眼就能认出来这是什么东西。 我本来以为这已经够逆天了。解码出来的内容才真的让人窒息。

    admin|pass123456|1713771788

    数据库的 user 表里面的用户名和密码也都是base64 编码存储的。

    我本以为这种最基本的常识问题,只可能在一个实习生身上发生,但是这个同事至少在这里干了 3 年了

    在他的知识库里 base64 编码=加密

    然后只有这种格式的才叫json。(用一对花括号包裹{}

    {
        "test": 1
    }
    

    这种不叫json,更别说其他的值类型的被叫json

    [
        "abc",
        "def"
    ]
    
    第 1 条附言  ·  213 天前
    可能我描述有问题,我的意思是,这个同事只认为花括号的才是 json ,其他的所有都不是。
    第 2 条附言  ·  211 天前
    看了大家这么多回复,我再来说个重磅的。
    很难相信把?我在的公司居然是一家专做安全的公司。
    205 条回复    2024-04-25 14:43:32 +08:00
    1  2  3  
    ljyst
        101
    ljyst  
       213 天前
    token 不都是随机后端生成保存在 session 里然后发给用户 cookies 的么?难道是我 out 了?
    crc8
        102
    crc8  
       213 天前
    3 年在人类的历史长河中微不足道~
    lasuar
        103
    lasuar  
       213 天前
    它的无知并不能凸显你的才能,因为你俩是同事。所以,尽可能做好分内的事,这个可以提醒一下他。
    ebushicao
        104
    ebushicao  
       213 天前
    从你的描述来讲这应该是他完全负责的,那按他的来就好,反正出了事你不用负责。为了这个和他发生不必要的冲突没意义,反而可能带来一些更麻烦的后果(同事之间因为一点小事下毒的也不是没有)。
    levelworm
        105
    levelworm  
       213 天前 via Android
    这种事情楼主可以专门开个讲座,不然这种事情还会发生。
    DefoliationM
        106
    DefoliationM  
       213 天前
    见过更逆天的,习惯就好,这种我一般也不会动,最后出问题了谁写的谁背锅就是了。
    xhatt510
        107
    xhatt510  
    OP
       213 天前
    @q727729853 可能是看得多了。一看就觉得长得像
    xhatt510
        108
    xhatt510  
    OP
       213 天前
    @lasuar 大哥说的对。并不能凸显我多会。提醒了的,别人一意孤行,特别犟。
    lidongyooo
        109
    lidongyooo  
       213 天前
    根据以下规则可得楼主也是个菜鸡,肉眼能分辨上面的字符是 base64 ?除非你没见过其他编码或加密方式。

    要根据字符特征识别一个字符串是否为 Base64 编码,可以遵循以下步骤和规则:

    1 、字符集检查:Base64 编码只使用特定的字符集,包括大写字母( A-Z )、小写字母( a-z )、数字( 0-9 )和两个特殊符号(+、/)。在 URL 安全的 Base64 变种中,可能会用-和_分别替换+和/。首先确保输入字符串仅由这些字符组成,不包含其他任何非法字符。

    2 、长度检查:Base64 编码将每 3 个字节( 24 位)的数据转换为 4 个 Base64 字符(每个字符对应 6 位)。因此,一个有效的 Base64 字符串的长度应该是 4 的整数倍,除非它在末尾包含填充字符=。
    当原始数据长度不是 3 的整数倍时,在编码的末尾会添加 1 个或 2 个=作为填充。这意味着如果字符串长度不是 4 的倍数,但减去末尾的=后变为 4 的倍数,则可以认为该字符串可能是 Base64 编码的。如果字符串长度既不是 4 的倍数,也没有以合法数量的=结束,则几乎可以确定它不是 Base64 编码。

    3 、填充字符检查:填充字符=仅出现在 Base64 字符串的末尾,用来标识编码过程中因原始数据长度不足而补充的零位。最多可能出现 2 个连续的=。
    如果字符串末尾有=,检查其数量。如果数量为 1 或 2 ,并且去掉这些=后,剩余部分的长度是 4 的整数倍,那么这是 Base64 编码的一个特征。否则,如果出现非法数量的=或者=出现在非末尾位置,可以断定这不是 Base64 编码。

    4 、正则表达式匹配: 使用正则表达式来快速验证字符串是否符合 Base64 编码的字符集和结构要求。例如,一个基本的正则表达式可以是 ^[A-Za-z0-9+/]+={0,2}$ 或者针对 URL 安全 Base64 的 ^[A-Za-z0-9-_]+={0,2}$。如果字符串能被此正则表达式成功匹配,说明它具有 Base64 编码的字符特征。
    younggod
        110
    younggod  
       213 天前
    不像人
    totoro52
        111
    totoro52  
       213 天前
    @superedlimited #65 估计以前是搞 php 的 我见过太多 php 程序这么干的了,用|分割用户账号密码加一个时间戳当 token ,然后也用 base64 但是是自己变了一点算法的 base64
    oamu
        112
    oamu  
       213 天前
    @xhatt510 #27 经典菜鸡言论:我不会 = 不支持/不行。
    oamu
        113
    oamu  
       213 天前
    @lidongyooo #109 符合这些规则的就一定是 Base64 编码?并不一定,只能说它能通过 Base64 的解析方式解析。
    Citrus
        114
    Citrus  
       213 天前 via iPhone   ❤️ 3
    叹为观止的是居然有很多人认为这样做是对的。真可怕。
    456vv
        115
    456vv  
       213 天前
    @crab 能黑库的,就不是这个用户密码了。
    qbqbqbqb
        116
    qbqbqbqb  
       213 天前
    @ljyst 你说的这种叫做 session id ,需要后端保存状态(也就是你说的“保存在 session 里”)。

    token 一般指的是支持无状态校验身份的,原理上是把用户身份和过期时间加密之后发给客户端,这样后端无需维持 session ,只要解密 token 就可以验证用户身份,在分布式的场景下很有用。可以了解一下 jwt 。
    GeruzoniAnsasu
        117
    GeruzoniAnsasu  
       212 天前
    @lidongyooo 辛苦你复制 GPT ,但有种东西叫 cyberchef:

    - https://gchq.github.io/CyberChef/ 打开它
    - 复制任意 base-wtf-like 字符串
    - 点下面的魔棒

    > 4 、正则表达式匹配: 使用正则表达式来快速验证字符串是否符合 Base64 编码的字符集和结构要求。例如,一个基本的正

    起码比肉眼正则靠谱
    jinliming2
        118
    jinliming2  
       212 天前 via iPhone   ❤️ 7
    @456vv #47 还真不一样。从攻击面的角度来说,密码在网上传输的次数越多,承担的风险越大。
    登录这个过程,用户名和密码必须要通过网络传输,这没办法。但登录后获取 token 的意义就在于,避免后续再传密码了,用 token 来充当用户名+密码。
    但如果 token 是固定不变的,那也没意义了,和 basic auth 一样,并不安全,所以 token 必须要经常变。
    token 当然不用是一次性的,但是必须要有时效性,定期续期,并且时效性越短越安全。比如银行网站就可能会要求 5 分钟不操作自动退出。
    用 token 来代替密码就是为了频繁更新,避免同一套字符串一直在网上传。

    所以,比较推荐的做法是,密码登录,换取两个 token ,一个是有较短时效的 session token ,一个是有较长时效但是一次性的 refresh token ,然后用 session token 通信,session token 过期后,再用 refresh token 获取两个新的 token 。
    这样,密码因为更新频率很低,并且长度通常相对较短,所以只在网上传输一次。refresh token 因为可以充当密码来获取新的 token ,所以只在网上传输两次(往返各一次)。session token 权限最低,只能在有限时间内使用,且不能充当密码来获取新 token ,泄漏后的影响也是有时效性的,用来进行低频敏感操作可能还会要求用密码来做二次认证。
    如果存在攻击者,那么他必须精准地获取登录包或者是 refresh token 的数据包,才可以拥有较高的权限,但这样的数据在网上传输的频率非常低。那么这个攻击者就必须长期攻击监控这个用户,那被用户发现的概率就提高了,而且大概率还只能拿到 refresh token 跟用户抢续期权,用户更容易发现账号被盗。
    way2explore2
        119
    way2explore2  
       212 天前 via Android
    是,技术不合格。

    其实也不奇怪,林子大了
    ljyst
        120
    ljyst  
       212 天前
    @qbqbqbqb 我好歹也有 7 。8 年后端功底你说的这些谁不懂。你意思是每次发送请求加个非对称加密 token 进去就不用 cookie 了是吗。另外还有一种就是每次变 token 防止模拟 http 请求。就算没有 cookie 在 header 里发送 token 后端也要验证请求信息啊!楼主的意思是他同事留后门。懂?
    winterbells
        121
    winterbells  
       212 天前 via Android
    我们公司也是明文,还因为用户记不住密码忽略大小写了…我一度以为是 bug
    chuck1in
        122
    chuck1in  
       212 天前 via iPhone
    @xhatt510 还招人吗 op ,是否支持远程
    ISOtropy
        123
    ISOtropy  
       212 天前 via Android
    @oott123 jwt 吗 但是不能把密码放进去吧 这样别人可以解密 一般是把不敏感信息放进去 编码 base64 例如用户名 时间等吧?
    Ashe007
        124
    Ashe007  
       212 天前 via iPhone   ❤️ 10
    这个帖子不就诈出了很多一模一样的菜鸡吗?菜就算了,不以为耻,反而各种借口嘲讽指出问题的人,这种人就两个字——恶心🤢
    snowyy
        125
    snowyy  
       212 天前
    @coffeygao 手机号降位了吗
    ShinichiYao
        126
    ShinichiYao  
       212 天前
    我也是这么做的,只不过不放密码,base64 之前会先用自定义方法加密一次字符串,只用来验证用户和时效
    lyxeno
        127
    lyxeno  
       212 天前
    我领导也用 Base64 存密码(应该快十年了)。我反馈不能这么存,他照样存。
    yKXSkKoR8I1RcxaS
        128
    yKXSkKoR8I1RcxaS  
       212 天前
    @Jasckcc #67 那推荐用什么?
    dj721xHiAvbL11n0
        129
    dj721xHiAvbL11n0  
       212 天前
    @gesse #17 你可能对 jwt 有误解,按照那个人的逻辑,用 jwt 就是密码加秘钥生成 token ,通过这个 token 是能直接知道密码是啥的,jwt 是对内容进行签名,内容还是明文的
    dj721xHiAvbL11n0
        130
    dj721xHiAvbL11n0  
       212 天前
    @ljyst #120 token 是非对称加密?你做 token 签名和认证的时候,用的是俩把钥匙吗?
    NoobNoob030
        131
    NoobNoob030  
       212 天前
    ? 挂我是吧,下班别走
    dj721xHiAvbL11n0
        132
    dj721xHiAvbL11n0  
       212 天前
    @qbqbqbqb token 的本质是对你给的内容用你的秘钥就行签名,他根本不会加密你的内容,只是做了 Base64 编码
    drymonfidelia
        133
    drymonfidelia  
       212 天前 via iPhone
    这算什么,我还接触过后台纯前端鉴权的商城项目,被黑了好几次,最后加了个 basicauth 解决
    killerv
        134
    killerv  
       212 天前
    我见过一个系统,有个记住密码功能,密码保存在 cookie……
    wangtian2020
        135
    wangtian2020  
       212 天前
    静态类型 boy 必须要把同属 json 的 jsonObject 和 jsonArray 分开解析是这样的
    Ashore
        136
    Ashore  
       212 天前
    @q727729853 #97 我猜可能是用的多了也就记住了
    wizardyhnr
        137
    wizardyhnr  
       212 天前
    其实真正楼主真正论证的是个人用户一定要用密码管理器+随机密码。
    dengji85
        138
    dengji85  
       212 天前
    类似事情多了去了,我还见过自动登录把另外一个系统账号全部设置成 123456 ,然后前台自动去登录的。。。然后 2 个数据源之间需要用分布式事务也搞不清楚,我说要即便不用分布式事务,日志记录详细点好人为处理异常也说不用,说这个系统有事物,加 @Transaction 就行了
    LieEar
        139
    LieEar  
       212 天前
    他肯定是直接 split("|"),然后[0]是 id ,[1]是密码。那我用户名或者密码包含|,那不就直接报错了
    moluyouwo
        140
    moluyouwo  
       212 天前
    tls 时代了,黑客想解密先破了 tls
    xhatt510
        141
    xhatt510  
    OP
       212 天前
    @lidongyooo 我只是举列子,数据库一堆==结尾的。我不可能把真的密码用户名复制出来把。。。
    lstz
        142
    lstz  
       212 天前 via Android
    @xhatt510 #81 看了一下我的工具箱,很惭愧我也把 Base64 放进加密解密那一处,不过我加了 FAQ 做备注 https://laftools.cn/cn/tools/go/codecs

    关于安全方面,你们公司应该会有定期培训的吧。。。很好奇他当时怎么进去的
    monkeydream
        143
    monkeydream  
       212 天前
    这种核心功能不应该是组长或者 leader 搞定吗?怎么还交给初级开发搞。
    huzhizhao
        144
    huzhizhao  
       212 天前
    就问你能不能用吧(手动笑脸~
    hyseiya
        145
    hyseiya  
       212 天前
    人和项目,有一个能跑就行。
    老哥,认真你就输了。
    Tink
        146
    Tink  
       212 天前
    @coffeygao #5 那不是手机号吧。。。
    Tink
        147
    Tink  
       212 天前
    其实还好,写多了就懂了
    DaneWalters
        148
    DaneWalters  
       212 天前   ❤️ 1
    不好意思,看成了“干了三年同事”,果然我脑子全是黄色废料
    shuson
        149
    shuson  
       212 天前
    看啥级别的系统,不能一概而论
    unco020511
        150
    unco020511  
       212 天前
    @matepi #6 V 站还天天有人说「 MD5 加密」呢,这找谁说理去
    dreamage
        151
    dreamage  
       212 天前
    草台班子:能用就行了
    qiyilai
        152
    qiyilai  
       212 天前
    怎么招进来的
    daozun
        153
    daozun  
       212 天前
    挂我是吧,晚上别睡太死-.-
    bk201
        154
    bk201  
       212 天前
    3 年 java 和刚毕业也没啥区别。很多好几年都没入门。
    Mrzhs
        155
    Mrzhs  
       212 天前
    推荐他去看看 JWT, 这样你就是大佬了~
    rahuahua
        156
    rahuahua  
       212 天前
    提供一个思路,如果觉得同事水平特别菜,你要想想你是不是该挪窝了,如果挪不到更好的窝就忍着吧
    ljyst
        157
    ljyst  
       212 天前
    @x2420390517 你对。我不懂!现在 cookie 验证都是存在数据库里的不然重启又得重新登录,不是刷新跳转。
    accelerator1
        158
    accelerator1  
       212 天前   ❤️ 3
    @supuwoerc LZ 明明想说的是“这种事情只可能发生在一个实习生身上”,不是“所有实习生都会犯这个错”,强行给楼主戴帽子么。。。
    azev
        159
    azev  
       212 天前
    @xhatt510 我以前有个同事,让我把移动端用户的访问 ip 传给他的服务端接口,当时我就懵了。
    ishalla
        160
    ishalla  
       212 天前
    前几天项目准备上线,gate review 的时候发现 URL 里带 secret 呢。。
    就是链接直接就 https://xxxxxxxclientid=XXXXX&clientsecret=XXXXXXX
    这还是合作了 10+年的 vendor ,OP 有没有觉得安慰一点?
    本安全架构已经看得麻木了。。
    icoomn
        161
    icoomn  
       212 天前
    加密,签名,证书,权限这些,不是真的做过强业务,很多人整不来
    xinshoushanglu
        162
    xinshoushanglu  
       212 天前
    单纯的菜而已,没人教他,可能这人性格 也不太愿意学,整体基础就不行,这样的人很多。
    只是大多数项目 基本活不到有 多少量的用户的阶段,也就发现不了这些安全问题了,干多少年也就这么糊弄过去
    0xC000009F
        163
    0xC000009F  
       212 天前
    虽然知道 base64 是编码,但平时沟通的时候经常习惯称 base64 加密。导致有次给国外同事发邮件,习惯性用了"encryption",他回邮件洋洋洒洒给我写了一堆"encryption"和"encoding"的区别。😂
    sampeng
        164
    sampeng  
       212 天前
    非常同情 LZ 的心情。但是你不是她他领导。你要说了他肯定急
    xhatt510
        165
    xhatt510  
    OP
       212 天前
    @ishalla 舒服多了。
    xhatt510
        166
    xhatt510  
    OP
       212 天前
    @rahuahua 忍着
    xhatt510
        167
    xhatt510  
    OP
       212 天前
    @DaneWalters 楼上有个和你一样的,满脑子 HS
    hnliuzesen
        168
    hnliuzesen  
       212 天前
    @xhatt510 哈哈,深有同感
    chenstor
        169
    chenstor  
       212 天前
    又不是不能用。。。。。。

    果然很优秀,刷新认知了
    listenEcho
        170
    listenEcho  
       212 天前
    哈哈,我目前做的业务也是发现了这个问题,很敏感的数据在 URL 上传递,也是用的 base64
    c3de3f21
        171
    c3de3f21  
       212 天前
    啊?我从来都是明文存 token 明文加到 header 里。。。。。。
    simo
        172
    simo  
       212 天前
    惭愧,08 年左右刚开始接触后端开发,也在数据库存明文密码。当时刚学后端开发没多久,对安全方面确实完全不懂,看别人的源码后,才明白相关的一些知识。也怪当时没被脚本小子们搞过,不然也能提早接受教育。
    那会教程少,运气好的话,有人带带,不然只能论坛、搜索引擎、博客碎片化学习。我当时是没碰到过系统的教程,基本都是一个个知识点积累起来,然后看书串知识点。
    coffeygao
        173
    coffeygao  
       212 天前
    @Tink 抱歉,我看错位数了,在前面已经澄清了。
    coffeygao
        174
    coffeygao  
       212 天前
    @snowyy 抱歉,我看错位数了,在前面已经澄清了。
    hun2008hun
        175
    hun2008hun  
       212 天前
    还行,上次听说公司有个人登陆用户是根据前端传的 uid=xxx 来获取
    EndlessMemory
        176
    EndlessMemory  
       212 天前
    整笑了,这他妈太离谱了
    yosoroAida
        177
    yosoroAida  
       212 天前
    @bk201
    别说 3 年了,我见过 6 年的,水平跟刚毕业的没啥区别
    Hudiebbk
        178
    Hudiebbk  
       212 天前
    这个世界就是个草台班子
    Email
        179
    Email  
       212 天前
    不以善小而不为 不以恶小而为之
    mark2025
        180
    mark2025  
       212 天前
    如果口令里面有个|就好玩了,比如 admin|pass123|456|1713771788
    pwelyn
        181
    pwelyn  
       212 天前
    把你 app 或网址 发来大家伙儿看看
    ZXiangQAQ
        182
    ZXiangQAQ  
       212 天前
    羡慕啊,我也想这么写,我们这接口都走加密的,巨恶心,先生成 sm4 密钥,然后使用 sm2 加密,sm3 对加密的参数签名,调用服务端协商密钥,后续调用都得加密
    vsheyan
        183
    vsheyan  
       212 天前
    引出一堆人 battle,小板凳观战 吃瓜👀
    cndns
        184
    cndns  
       212 天前 via Android
    叫公司做个三级等保,就要整改。
    456vv
        185
    456vv  
       212 天前
    @jinlliming2 登录后依然存留用户密码是不对的,后转为 token 没有时效也不对。要是 token 与明文密码无区别,惟一只是增加了技术门槛,对攻击者来说有什么区别! session_token 和 refresh_token 只用于不同渠道的权限上使用。在登录方面我只指望于 ssl ,防中间人就可以。在前端各总加密都没卵用,要是自身中毒了,反正你卡里余额也不多。哈哈。
    456vv
        186
    456vv  
       212 天前
    @lidongyooo 讲个加密的 Base64 方法给他们学学
    wanguorui123
        187
    wanguorui123  
       212 天前 via iPhone
    BasicAuth 而已
    asmoker
        188
    asmoker  
       212 天前 via Android
    不合规 ༄༅
    moqsien
        189
    moqsien  
       211 天前
    以前,看到写得烂的代码,尤其是 python 这种动态语言的代码,就特别鄙视。

    写 py 那会,遇到的好多人都是半路出家,程序能跑就行,什么规范啥的,别想了。后来,渐渐习惯,反正哪里不是一坨屎。很多人都是混口饭吃,哪有什么追求。甚至大部分人,能躺着绝不坐着,你还指望他能自觉学习,进步,改正?没有外部压力,人家是绝不会动的。所以,只要不是特别难受的,随它去了。很多事情,自己知道就好,有追求的,自己去追求,个人自扫门前雪,不管他人瓦上霜。

    拙见。

    顺便推广一下个人的 sdk 版本管理器 version-manager ( vmr )。

    vmr 目前支持 Java, Go, Node.js, Deno, Bun, .Net, Python, PhP, Rust, Kotlin, Scala, Flutter, Julia, Zig, V, Odin, Typst 等等 40 + 种语言和工具的一键安装、版本切换、环境变量管理等。

    支持全局模式、session 模式、project 模式(项目锁定 sdk 版本,使用 cdr 命令切换目录时,自动检测并切换版本,全局不受影响)。

    包含了 zig ,v ,typst 等语言的 lsp ,vscode 可以直接使用。

    如果您感兴趣,version-manager 项目期待您的加入。

    项目地址: https://github.com/gvcgo/version-manager
    项目文档: https://github.com/gvcgo/version-manager/blob/main/docs/readmeCN.md
    yao00jun
        190
    yao00jun  
       211 天前
    学习了
    DesnLee
        191
    DesnLee  
       211 天前
    基础不牢是这样的,
    dododada
        192
    dododada  
       211 天前
    其实还是公司安全培训的问题,前司一次弱密码警告,二次弱密码罚款,三次就开了
    xhatt510
        193
    xhatt510  
    OP
       211 天前
    @dododada 很难相信把?我在的公司居然是一家专做安全的公司
    dododada
        194
    dododada  
       211 天前
    @xhatt510 开了吧,明文和弱密码是必须禁止的,无论内外什么环境,即使物理隔离,因为人是最大的安全隐患。以前有个同事的 mac 中了毒,他把公司的苹果账号存在本地了,然后我们就见识了一下供应链攻击,前后两分钟,公司账号下的 app 以及账号上的钱就被转到捷克去了,虽然没多少钱,但是真的不安全
    xhatt510
        195
    xhatt510  
    OP
       211 天前
    @dododada #194 你猜我要是有本事开人,我的标题是不是应该叫:“逆天!干了 3 年的同事用 base64 编码做 token 并且把密码也放了进去。要不要开了?”
    lbunderway
        196
    lbunderway  
       211 天前
    自己搞一套 base64 的字符集也不是不可以
    EJW
        197
    EJW  
       211 天前
    这帖还挺刷新我认知的,这么多人觉得无所谓
    forty
        198
    forty  
       211 天前
    很多半懂不懂的人在说“base64 加密”,编码就编码,非要说什么加密,仿佛一眼看不出来明文的就是加密,导致一些小白也被带偏了。哈希摘要也同理,有人就喜欢说“md5 加密”。
    igeeky
        199
    igeeky  
       211 天前
    用户的密码存储密文是不符合国家信息安全相关的法律规定的. (什么法不记得了, 但是国家肯定有要求). 你们还是做信息安全的, 支持开除.
    leaves615
        200
    leaves615  
       211 天前
    这系统有攻击价值吗?
    1  2  3  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1415 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:27 · PVG 01:27 · LAX 09:27 · JFK 12:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.