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

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

  •  1
     
  •   xhatt510 · 2024-04-22 16:03:46 +08:00 · 28776 次点击
    这是一个创建于 367 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    这就是 token YWRtaW58cGFzczEyMzQ1NnwxNzEzNzcxNzg4

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

    admin|pass123456|1713771788

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

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

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

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

    {
        "test": 1
    }
    

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

    [
        "abc",
        "def"
    ]
    
    第 1 条附言  ·  2024-04-22 16:39:23 +08:00
    可能我描述有问题,我的意思是,这个同事只认为花括号的才是 json ,其他的所有都不是。
    第 2 条附言  ·  2024-04-24 14:42:40 +08:00
    看了大家这么多回复,我再来说个重磅的。
    很难相信把?我在的公司居然是一家专做安全的公司。
    205 条回复    2024-04-25 14:43:32 +08:00
    1  2  3  
    oott123
        1
    oott123  
       2024-04-22 16:10:13 +08:00   ❤️ 4
    你听说过 basic auth 吗(

    严格来说把密码当成 token 也不是不行
    soundlife
        2
    soundlife  
       2024-04-22 16:13:12 +08:00   ❤️ 6
    有些离谱,但不过多评价,因为我也是菜鸡。每个人菜的方向都不一样吧
    xhatt510
        3
    xhatt510  
    OP
       2024-04-22 16:13:36 +08:00
    @oott123 听过,用过。这样的嘛?我在学习学习
    xhatt510
        4
    xhatt510  
    OP
       2024-04-22 16:15:24 +08:00
    @soundlife 我感觉特别窒息,每次和这个人有交集的时候 都有一种无力感。而且特别犟。
    coffeygao
        5
    coffeygao  
       2024-04-22 16:15:40 +08:00   ❤️ 9
    你解密出来的数据出现了手机号,看起来不是很友好,希望下次注意,避免泄露他人隐私。
    matepi
        6
    matepi  
       2024-04-22 16:15:45 +08:00
    编解码、加解密、摘要、加盐

    CRUD boy 确实很多不认识的

    再进一步地上面的都认识了,是不是就安全了呢……又要讲什么 防重放、中间人

    那不得又是一堆人不认识的

    咋办,得教得学啊
    soundlife
        7
    soundlife  
       2024-04-22 16:16:57 +08:00
    @coffeygao 10 位的
    xhatt510
        8
    xhatt510  
    OP
       2024-04-22 16:17:51 +08:00
    @coffeygao 最后那个是个时间戳。不是手机号
    yuzo555
        9
    yuzo555  
       2024-04-22 16:18:12 +08:00
    前后端交互过程中,强制 HTTPS 的情况下,这样做可以的。
    数据库这样存不行,不能存明文。
    gav1nwwk
        10
    gav1nwwk  
       2024-04-22 16:18:22 +08:00
    高级
    GOOD21
        11
    GOOD21  
       2024-04-22 16:18:27 +08:00   ❤️ 1
    @coffeygao 仔细看,是时间戳。
    coffeygao
        12
    coffeygao  
       2024-04-22 16:18:27 +08:00
    @xhatt510 @soundlife
    抱歉,我没仔细看。
    xhatt510
        13
    xhatt510  
    OP
       2024-04-22 16:19:01 +08:00
    @matepi 没有绝对安全,只有相对安全。我只是觉得这应该是一个开发需要掌握的最基本的知识。
    pdxjun
        14
    pdxjun  
       2024-04-22 16:20:45 +08:00
    @xhatt510 #4 深有感受
    tool2dx
        15
    tool2dx  
       2024-04-22 16:20:51 +08:00
    他可能觉得自己的 cookie 保存的密码,只有自己能看,看不了别人的 cookie (密码)。
    povsister
        16
    povsister  
       2024-04-22 16:21:24 +08:00
    世界就是依赖草台班子运行滴
    stay calm
    gesse
        17
    gesse  
       2024-04-22 16:23:24 +08:00
    你直接告诉他用 jwt 就行了,发帖没必要。
    xhatt510
        18
    xhatt510  
    OP
       2024-04-22 16:26:12 +08:00
    @gesse 人家写 java 的,我做 python 的,关于 token 别人也没问我,也轮不到我去指点。关于存数据库的 我说了数据库不要存 base64 之后的内容,人家不还是照存不误。所以只能发帖吐槽。
    blackmirror
        19
    blackmirror  
       2024-04-22 16:28:27 +08:00
    下次你们系统上线的时候通知下
    xhatt510
        20
    xhatt510  
    OP
       2024-04-22 16:30:36 +08:00
    @povsister 见识到了
    duan602728596
        21
    duan602728596  
       2024-04-22 16:31:32 +08:00
    我这以前还有接口直接返回明文密码的时候,还得我这个前端反馈、写个 node server 临时解决这个问题。最后也是好几个月才解决掉。
    abcde123456789
        22
    abcde123456789  
       2024-04-22 16:32:01 +08:00
    面向领导/用户编程

    用户要加密某个东西,base64 糊弄一下就过去了
    yeyang5211
        23
    yeyang5211  
       2024-04-22 16:33:31 +08:00
    其实有时候只是为了偷懒😆 ,也不排除菜 .
    ShundL
        24
    ShundL  
       2024-04-22 16:33:37 +08:00
    小项目 能用就行,管它三七二十一
    mohuani
        25
    mohuani  
       2024-04-22 16:34:23 +08:00   ❤️ 2
    @soundlife 每个人菜的方向都不一样 有意思
    xhatt510
        26
    xhatt510  
    OP
       2024-04-22 16:35:08 +08:00
    @duan602728596
    @abcde123456789
    太逆天了。和他又是平级关系,我也没能力去命令他怎么怎么样。每次沟通有一种无力感,只能发帖吐槽一下了。
    xhatt510
        27
    xhatt510  
    OP
       2024-04-22 16:36:59 +08:00   ❤️ 11
    @yeyang5211 经过这么久打交道,我发现这个人不仅喜欢偷懒而且还菜。口头禅就是:Java 和 python 不一样,java 里面搞不了这、搞不了那。恰巧搞这项目的就他一个 java ,没人能反驳他。我也不会 java 。但是我可以知道,java 这么大体量的东西,不可能这搞不了那搞不了
    body007
        28
    body007  
       2024-04-22 16:38:06 +08:00
    @xhatt510 #3 curl -v -u "username:password" http://xxx ,就这个,直接在 http header 里面把用户名密码用 base64 编码传给服务器,webdav 就这样干的,不过用 https 的话还是有点安全性吧。
    lambdaq
        29
    lambdaq  
       2024-04-22 16:38:06 +08:00
    然后只有这种格式的才叫 json 。(用一对花括号包裹{})


    我觉得 LZ 你可能也没了解全貌。。。纸面上的 json 格式,只要能被 js eval(),都算合法的。

    看官网吧 https://www.json.org/ ,你说的是第一种情况,object ,第二种情况就是 An array is an ordered collection of values 。。。

    当然把密码搞进去比较离谱,但是 json 格式其实非常宽松。。。。
    e3c78a97e0f8
        30
    e3c78a97e0f8  
       2024-04-22 16:38:50 +08:00   ❤️ 1
    HTTPS 传输的 token 可以真么干
    存数据库的密码不能这么干
    而且楼主,密码不能只做一次 md5 就存储,md5 不安全而且没有盐会有彩虹表攻击,正确的做法是用 argon2 或者 scrypt 加盐哈希再存储
    supuwoerc
        31
    supuwoerc  
       2024-04-22 16:39:06 +08:00   ❤️ 1
    别尬黑实习生啊,我带的实习生开周会都分享了 Bcrypt 和常见的几种加密实现的异同和优缺点了...
    yhxx
        32
    yhxx  
       2024-04-22 16:46:45 +08:00
    跑个题,时间戳都 171 了啊
    果然岁月如梭
    lsk569937453
        33
    lsk569937453  
       2024-04-22 16:48:25 +08:00   ❤️ 1
    不好意思把标题读成了:

    逆天!干! 3 年的同事用 XXXX
    ck65
        34
    ck65  
       2024-04-22 16:49:44 +08:00
    领导嫩了点只能说
    MossFox
        35
    MossFox  
       2024-04-22 16:51:41 +08:00   ❤️ 15
    试一下下回在用户名或者密码里面包含一个 "|" 会发生上面
    MossFox
        36
    MossFox  
       2024-04-22 16:51:47 +08:00
    *什么
    gamexg
        37
    gamexg  
       2024-04-22 16:54:00 +08:00
    我好奇如果用户密码带 | 会出现什么效果
    JoeDH
        38
    JoeDH  
       2024-04-22 16:56:28 +08:00
    这种就是连最基本的八股文都不背的那种人
    cndenis
        39
    cndenis  
       2024-04-22 16:56:44 +08:00   ❤️ 3
    @xhatt510 数据库存明文密码这么劲爆的事, 如果他不改你可以报告领导, 如果领导认为不用改你就可以走人了, 早晚得爆雷.
    FengMubai
        40
    FengMubai  
       2024-04-22 16:56:48 +08:00 via Android
    我司也差不多,会话密钥从服务端获取的。密钥得加密啊,密钥的密钥和密钥一起传了(尽管还做了一些变换
    flytsuki
        41
    flytsuki  
       2024-04-22 16:57:59 +08:00
    @gamexg +1
    realJamespond
        42
    realJamespond  
       2024-04-22 16:58:49 +08:00
    https 没啥问题吧
    fkname
        43
    fkname  
       2024-04-22 16:59:54 +08:00
    可能接触的少,大部分认证这种逻辑都是统一封装处理了;不改也能理解,给领导说我们系统有漏洞要修,因为我导致的,很少有人会这么干
    woodfizky
        44
    woodfizky  
       2024-04-22 17:02:21 +08:00
    其实用 HTTPS ,登录获取 token 明文传都算能接受的。

    但是这种又菜又喜欢私造协议的其实很烦,明明可以用键值对穿用户密码时间戳,非要用|分割拼在一起。

    而且看 OP 描述我怎么感觉这是把 '用户名|密码|时间戳' base64 编码了再作为 token ,每次请求都用这个呢。。。
    这压根没有服务端状态验证吧,那我把时间戳改成未来时间,这个登录态就一直不会掉了。。

    而且我还能用这个 token 机制暴力穷举出你库里的各种用户名密码。
    NoKic
        45
    NoKic  
       2024-04-22 17:03:06 +08:00
    @gamexg 直接废废了呗 分不清用户名密码在哪截断了直接
    forvvvv123
        46
    forvvvv123  
       2024-04-22 17:04:34 +08:00
    @lsk569937453 哈哈哈哈哈哈哈哈
    456vv
        47
    456vv  
       2024-04-22 17:06:30 +08:00
    正常,难道你登录时不是使用用户密码?又难道你的 token 又有 IP 限制或一次性的?偷用你的用户密码和 token 区别在那里?
    xxkmogu
        48
    xxkmogu  
       2024-04-22 17:07:34 +08:00
    咱刚入行的时候面对一个必须要传递密码原文到后端的场景,就已经对密码进行非对称加密了,即便是在 https 的情况下。(骄傲
    yulgang
        49
    yulgang  
       2024-04-22 17:13:17 +08:00
    又不是不能用
    xwwsxp
        50
    xwwsxp  
       2024-04-22 17:15:22 +08:00
    这算个啥,和我对接的那个 Andriod ,那才是崩溃,调用阿里的两个接口,我都封装好了,文档都写好了,JSON 交互,还给我传其他格式,接口测试环境,我都是通过 swagger 搭建的;阿里那边返回的数据,让其通过 io 类写到本地,防止 token 中有些特殊字符被控制台解析,这也不会,TMD 的,干什么 Android

    ==========

    更离谱的事,我在给他调试接口,他在和别人聊游戏,就这还 3 年,我 3 年不是这么菜的;菜,还脾气大,和我吵,直接让你滚蛋!!!
    xhatt510
        51
    xhatt510  
    OP
       2024-04-22 17:18:31 +08:00
    @MossFox #35 大概率会报错,或者说这个开发会说 java 里面 xxx 一堆借口
    xhatt510
        52
    xhatt510  
    OP
       2024-04-22 17:19:32 +08:00
    @woodfizky 就是你猜的那样,'用户名|密码|时间戳' 然后 base64 编码了再作为 token ,每次请求都用这个。并且数据库用户表有个字段叫 token 把这个数据存了一份。
    xhatt510
        53
    xhatt510  
    OP
       2024-04-22 17:20:25 +08:00   ❤️ 3
    @lambdaq 估计是你看错了,我说的是他堆 json 不了解。强制认为只有 {} 的才是 json
    msg7086
        54
    msg7086  
       2024-04-22 17:20:27 +08:00
    您对同事有什么误解吗。
    crab
        55
    crab  
       2024-04-22 17:23:07 +08:00
    @456vv 数据库被黑。就像当年 csdn 事件。
    woodfizky
        56
    woodfizky  
       2024-04-22 17:23:37 +08:00
    @xhatt510 #52
    好好好。。这么玩是吧。
    这私造协议 1 暴露密码,2 不防篡改,3 服务端会话维持放关系数据库。。连 JWT 都不用,那没什么好说的了。

    哎,无奈我也碰见过这样的同事,已经有画面感了,想到就烦。
    jsq2627
        57
    jsq2627  
       2024-04-22 17:24:28 +08:00
    遇见这样的同事和项目想必已经是屎上雕花。谁写谁背锅,身为外人当作看不见就对了。
    moqsien
        58
    moqsien  
       2024-04-22 17:24:58 +08:00
    挺好的,就欣赏这样的同事。
    qinfengge
        59
    qinfengge  
       2024-04-22 17:26:02 +08:00
    手写登录注册没必要,还不如用第三方,毕竟不一定有别人考虑的全面。
    holdmeo
        60
    holdmeo  
       2024-04-22 17:26:56 +08:00
    @xhatt510 这种是放在请求头里,实际上也不行吧,太直观了,接口给别人调用,相当于直接给了别人一个账号
    Jasckcc
        61
    Jasckcc  
       2024-04-22 17:32:48 +08:00   ❤️ 2
    正常的登录逻辑:校验 token -> 检验缓存是否存在用户 -> token 续期 or 省略 -> 拦截器放行 -> 查询用户是否存在 -> RSA 解密前端密码 -> 得到初始密码 -> 哈希再次加密密码(可考虑加盐) -> 匹配数据库密码 -> 缓存用户 -> 返回 token 以及用户信息。
    pyKane
        62
    pyKane  
       2024-04-22 17:33:24 +08:00
    如果所有的通信过程都是在 HTTPS 的情况下完成,也不是不可以。HTTPS 本身就把所有的全加密了。这就是为什么现在很多支付网关,只需要一个 KEY 放在 HEADER 上就可以了。比如 Stripe .
    只是如果那个密码是用来登录用的还明文存在了数据库,确实是不好。
    InkStone
        63
    InkStone  
       2024-04-22 17:33:35 +08:00
    @yuzo555 其它需要加密的信息可以 https 直接传。密码不一样,在任何情况下不能传出客户端。
    FrankAdler
        64
    FrankAdler  
       2024-04-22 17:34:25 +08:00   ❤️ 2
    @oott123 传输层面和存储层面不能划等号的。
    superedlimited
        65
    superedlimited  
       2024-04-22 17:34:57 +08:00 via iPhone
    这个时间戳一看就是很大可能拍黄片的开发搞出来的
    yKXSkKoR8I1RcxaS
        66
    yKXSkKoR8I1RcxaS  
       2024-04-22 17:35:36 +08:00
    密码 MD5 加盐存。
    但是 Token 的话一般 RSA 或者 AES 加密。
    Jasckcc
        67
    Jasckcc  
       2024-04-22 17:39:14 +08:00
    @Seria MD5 已经过时了,不推荐使用
    lambdaq
        68
    lambdaq  
       2024-04-22 17:41:40 +08:00
    @xhatt510 哦哈哈。。。。
    xhatt510
        69
    xhatt510  
    OP
       2024-04-22 17:46:05 +08:00
    @jsq2627 新项目,从新建 git 仓库开始的。一开始就拉了坨大的
    ovtfkw
        70
    ovtfkw  
       2024-04-22 17:48:28 +08:00 via iPhone
    前端加密不是伪命题吗,数据库存的加密就行了
    Grand
        71
    Grand  
       2024-04-22 17:50:13 +08:00
    不怕你同事也逛 v 站嘛
    way2create
        72
    way2create  
       2024-04-22 17:51:38 +08:00
    @superedlimited 上边说了半天 java 你是一点不看啊
    KingZZZZ
        73
    KingZZZZ  
       2024-04-22 17:52:16 +08:00
    最危险的地方就是最安全的地方
    xhatt510
        74
    xhatt510  
    OP
       2024-04-22 17:52:55 +08:00
    @Grand 希望他来看一下
    jqtmviyu
        75
    jqtmviyu  
       2024-04-22 17:55:31 +08:00
    wc, json 只见过传键值对的, 原来还有有序列表.
    是我见识太少了么, 还是说用的人不多.
    bthulu
        76
    bthulu  
       2024-04-22 17:56:24 +08:00   ❤️ 2
    @xhatt510 你这么牛逼, 不也还是跟他平级. 事实就是别想太多, 早点糊弄完下班.
    Hopetree
        77
    Hopetree  
       2024-04-22 17:58:29 +08:00
    相当于没有一点常识的人,但是这种人我见过不少,真的,很多系统做单点登录的时候,为了方便,就直接给对接系统传一个用户名过去,表示登录成功,也就是说你只需要手动传一下这个用户名,你也可以登录成功,等于不需要认证
    ZnductR0MjHvjRQ3
        78
    ZnductR0MjHvjRQ3  
       2024-04-22 18:06:52 +08:00
    很离谱 经验太少且不愿意思考
    xhatt510
        79
    xhatt510  
    OP
       2024-04-22 18:07:33 +08:00
    @bthulu 哈哈哈哈,大哥说的对!
    lstz
        80
    lstz  
       2024-04-22 18:07:36 +08:00 via Android
    也许是各大网站的 base64 列于加密解密项让人误导了
    xhatt510
        81
    xhatt510  
    OP
       2024-04-22 18:08:51 +08:00
    @jqtmviyu 单个值也是合法的 json 串。只要符合 json 的规范就可以了。是用的少,常用的是键值对里面嵌套 list
    xhatt510
        82
    xhatt510  
    OP
       2024-04-22 18:10:25 +08:00
    @lstz 确实和一个朋友讨论过有可能是这个原因。也就是上面有老哥说的,八股文都不愿意背的那种。经验太少且不愿意思考
    qeqv
        83
    qeqv  
       2024-04-22 18:12:07 +08:00
    "foobar"
    123
    null
    {}
    []
    以上都是合法 JSON
    @jqtmviyu
    qeqv
        84
    qeqv  
       2024-04-22 18:13:40 +08:00
    之前在站内碰见一个 md5 加密联系方式的,我指出错误他还给我发白眼表情。
    碰到这样的你还能咋办,凉拌咯
    JohnChang
        85
    JohnChang  
       2024-04-22 18:13:54 +08:00
    话说 Base64 是用来干嘛的?这玩意除了装逼好像没看到啥实际的用途。
    retanoj
        86
    retanoj  
       2024-04-22 18:21:40 +08:00
    @JohnChang
    让不能使用特殊字符传输的场景变得可能
    比如 json 里传 bin
    renyi1986
        87
    renyi1986  
       2024-04-22 18:21:55 +08:00
    我给你讲过笑话当年 csdn 也是明文存储,还被脱了裤
    jqtmviyu
        88
    jqtmviyu  
       2024-04-22 18:26:36 +08:00
    @qeqv #83 我收过的大部分是这种类型. 还有我最讨厌有的返回空, 有的返回 null, 两种混合的.
    {
    "data": {},
    "status": 0,
    "statusInfo": {
    "message": "给用户的提示信息",
    "detail": "用于排查错误的详细错误信息"
    }
    }
    azhangbing
        89
    azhangbing  
       2024-04-22 18:36:54 +08:00
    牛逼,我是客户端,别说 token 我们重要接口是 AES 加密内容 RSA 加密 AES 的秘钥 + HTTPS 双向证书验证 证书秘钥采用自定义偏移位的算法 到 SO 中 采用 LLVM 混淆
    lqw3030
        90
    lqw3030  
       2024-04-22 18:41:53 +08:00
    告诉同事 base64 算编码不算加密,他的操作存在风险。工作嘛,向下兼容,高效沟通。
    ChainLock
        91
    ChainLock  
       2024-04-22 18:59:13 +08:00
    用 jwt 可以吗
    superedlimited
        92
    superedlimited  
       2024-04-22 19:00:12 +08:00 via iPhone
    @way2create 哼😾讨厌了啦😠
    zpxshl
        93
    zpxshl  
       2024-04-22 19:04:06 +08:00
    @JohnChang
    1. 有些地方只能传输字符串,因此需要用 base64 编码。 例子:JSB 传文件
    2. 避免自己的信息被明文索引到,论坛里面经常用来编码自己的微信号。
    Ackvincent
        94
    Ackvincent  
       2024-04-22 19:07:09 +08:00   ❤️ 1
    他的能力和工资相匹配吗?匹配的话没什么问题
    exploreexe
        95
    exploreexe  
       2024-04-22 19:08:41 +08:00
    让我想起了 CSDN 明文存密码。
    businessch
        96
    businessch  
       2024-04-22 19:21:42 +08:00 via iPhone
    其实吧,可能他的上一个领导就是明文,他改进了下,这样可以逆向修改。
    q727729853
        97
    q727729853  
       2024-04-22 19:24:24 +08:00
    YWRtaW58cGFzczEyMzQ1NnwxNzEzNzcxNzg4
    为啥一看这个就知道是 base64 加密的?
    qingyingwan
        98
    qingyingwan  
       2024-04-22 19:30:07 +08:00
    @JohnChang base64 就是一个编码二进制数据的方法,比如图片,文件,游戏存档之类的
    adian
        99
    adian  
       2024-04-22 19:30:24 +08:00
    太不专业了
    07aPzknB16ui9Cp3
        100
    07aPzknB16ui9Cp3  
       2024-04-22 19:31:39 +08:00   ❤️ 4
    在什么场景下用户密码都不应该明文存放,这种人就是技术素养极低,技术素养低的人一般逻辑思维也很差(原因),直接开除就可以了
    1  2  3  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3030 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:40 · PVG 20:40 · LAX 05:40 · JFK 08:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.