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

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

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

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

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

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

    这就是 token YWRtaW58cGFzczEyMzQ1NnwxNzEzNzcxNzg4

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

    admin|pass123456|1713771788

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

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

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

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

    {
        "test": 1
    }
    

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

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

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

    CRUD boy 确实很多不认识的

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

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

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

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


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

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

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

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

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

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

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

    ==========

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

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