1/3
空间。不如直接加盐然后存 md5 。当我看到 token 的时候,我人直接傻了。
YWRtaW58cGFzczEyMzQ1NnwxNzEzNzcxNzg4
我相信只要干过开发的人一眼就能认出来这是什么东西。 我本来以为这已经够逆天了。解码出来的内容才真的让人窒息。
admin|pass123456|1713771788
数据库的 user 表里面的用户名和密码也都是base64 编码
存储的。
我本以为这种最基本的常识问题,只可能在一个实习生身上发生,但是这个同事至少在这里干了 3 年了
base64 编码
=加密json
。(用一对花括号包裹{}
){
"test": 1
}
这种不叫json
,更别说其他的值类型的被叫json
[
"abc",
"def"
]
101
ljyst 249 天前
token 不都是随机后端生成保存在 session 里然后发给用户 cookies 的么?难道是我 out 了?
|
102
crc8 249 天前
3 年在人类的历史长河中微不足道~
|
103
lasuar 249 天前
它的无知并不能凸显你的才能,因为你俩是同事。所以,尽可能做好分内的事,这个可以提醒一下他。
|
104
ebushicao 249 天前
从你的描述来讲这应该是他完全负责的,那按他的来就好,反正出了事你不用负责。为了这个和他发生不必要的冲突没意义,反而可能带来一些更麻烦的后果(同事之间因为一点小事下毒的也不是没有)。
|
105
levelworm 249 天前 via Android
这种事情楼主可以专门开个讲座,不然这种事情还会发生。
|
106
DefoliationM 249 天前
见过更逆天的,习惯就好,这种我一般也不会动,最后出问题了谁写的谁背锅就是了。
|
107
xhatt510 OP @q727729853 可能是看得多了。一看就觉得长得像
|
109
lidongyooo 249 天前
根据以下规则可得楼主也是个菜鸡,肉眼能分辨上面的字符是 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 编码的字符特征。 |
110
younggod 249 天前
不像人
|
111
totoro52 249 天前
@superedlimited #65 估计以前是搞 php 的 我见过太多 php 程序这么干的了,用|分割用户账号密码加一个时间戳当 token ,然后也用 base64 但是是自己变了一点算法的 base64
|
113
oamu 249 天前
@lidongyooo #109 符合这些规则的就一定是 Base64 编码?并不一定,只能说它能通过 Base64 的解析方式解析。
|
114
Citrus 249 天前 via iPhone 3
叹为观止的是居然有很多人认为这样做是对的。真可怕。
|
116
qbqbqbqb 249 天前
@ljyst 你说的这种叫做 session id ,需要后端保存状态(也就是你说的“保存在 session 里”)。
token 一般指的是支持无状态校验身份的,原理上是把用户身份和过期时间加密之后发给客户端,这样后端无需维持 session ,只要解密 token 就可以验证用户身份,在分布式的场景下很有用。可以了解一下 jwt 。 |
117
GeruzoniAnsasu 249 天前
@lidongyooo 辛苦你复制 GPT ,但有种东西叫 cyberchef:
- https://gchq.github.io/CyberChef/ 打开它 - 复制任意 base-wtf-like 字符串 - 点下面的魔棒 > 4 、正则表达式匹配: 使用正则表达式来快速验证字符串是否符合 Base64 编码的字符集和结构要求。例如,一个基本的正 起码比肉眼正则靠谱 |
118
jinliming2 249 天前 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 跟用户抢续期权,用户更容易发现账号被盗。 |
119
way2explore2 249 天前 via Android
是,技术不合格。
其实也不奇怪,林子大了 |
120
ljyst 249 天前
@qbqbqbqb 我好歹也有 7 。8 年后端功底你说的这些谁不懂。你意思是每次发送请求加个非对称加密 token 进去就不用 cookie 了是吗。另外还有一种就是每次变 token 防止模拟 http 请求。就算没有 cookie 在 header 里发送 token 后端也要验证请求信息啊!楼主的意思是他同事留后门。懂?
|
121
winterbells 248 天前 via Android
我们公司也是明文,还因为用户记不住密码忽略大小写了…我一度以为是 bug
|
123
ISOtropy 248 天前 via Android
@oott123 jwt 吗 但是不能把密码放进去吧 这样别人可以解密 一般是把不敏感信息放进去 编码 base64 例如用户名 时间等吧?
|
124
Ashe007 248 天前 via iPhone 10
这个帖子不就诈出了很多一模一样的菜鸡吗?菜就算了,不以为耻,反而各种借口嘲讽指出问题的人,这种人就两个字——恶心🤢
|
125
6bZooCdy9YC5QP8T 248 天前
@coffeygao 手机号降位了吗
|
126
ShinichiYao 248 天前
我也是这么做的,只不过不放密码,base64 之前会先用自定义方法加密一次字符串,只用来验证用户和时效
|
127
lyxeno 248 天前
我领导也用 Base64 存密码(应该快十年了)。我反馈不能这么存,他照样存。
|
128
yKXSkKoR8I1RcxaS 248 天前
@Jasckcc #67 那推荐用什么?
|
129
dj721xHiAvbL11n0 248 天前
@gesse #17 你可能对 jwt 有误解,按照那个人的逻辑,用 jwt 就是密码加秘钥生成 token ,通过这个 token 是能直接知道密码是啥的,jwt 是对内容进行签名,内容还是明文的
|
130
dj721xHiAvbL11n0 248 天前
@ljyst #120 token 是非对称加密?你做 token 签名和认证的时候,用的是俩把钥匙吗?
|
131
NoobNoob030 248 天前
? 挂我是吧,下班别走
|
132
dj721xHiAvbL11n0 248 天前
@qbqbqbqb token 的本质是对你给的内容用你的秘钥就行签名,他根本不会加密你的内容,只是做了 Base64 编码
|
133
drymonfidelia 248 天前 via iPhone
这算什么,我还接触过后台纯前端鉴权的商城项目,被黑了好几次,最后加了个 basicauth 解决
|
134
killerv 248 天前
我见过一个系统,有个记住密码功能,密码保存在 cookie……
|
135
wangtian2020 248 天前
静态类型 boy 必须要把同属 json 的 jsonObject 和 jsonArray 分开解析是这样的
|
136
Ashore 248 天前
@q727729853 #97 我猜可能是用的多了也就记住了
|
137
wizardyhnr 248 天前
其实真正楼主真正论证的是个人用户一定要用密码管理器+随机密码。
|
138
dengji85 248 天前
类似事情多了去了,我还见过自动登录把另外一个系统账号全部设置成 123456 ,然后前台自动去登录的。。。然后 2 个数据源之间需要用分布式事务也搞不清楚,我说要即便不用分布式事务,日志记录详细点好人为处理异常也说不用,说这个系统有事物,加 @Transaction 就行了
|
139
LieEar 248 天前
他肯定是直接 split("|"),然后[0]是 id ,[1]是密码。那我用户名或者密码包含|,那不就直接报错了
|
140
moluyouwo 248 天前
tls 时代了,黑客想解密先破了 tls
|
141
xhatt510 OP @lidongyooo 我只是举列子,数据库一堆==结尾的。我不可能把真的密码用户名复制出来把。。。
|
142
lstz 248 天前 via Android
@xhatt510 #81 看了一下我的工具箱,很惭愧我也把 Base64 放进加密解密那一处,不过我加了 FAQ 做备注 https://laftools.cn/cn/tools/go/codecs
关于安全方面,你们公司应该会有定期培训的吧。。。很好奇他当时怎么进去的 |
143
monkeydream 248 天前
这种核心功能不应该是组长或者 leader 搞定吗?怎么还交给初级开发搞。
|
144
huzhizhao 248 天前
就问你能不能用吧(手动笑脸~
|
145
hyseiya 248 天前
人和项目,有一个能跑就行。
老哥,认真你就输了。 |
147
Tink 248 天前
其实还好,写多了就懂了
|
148
DaneWalters 248 天前 1
不好意思,看成了“干了三年同事”,果然我脑子全是黄色废料
|
149
shuson 248 天前
看啥级别的系统,不能一概而论
|
150
unco020511 248 天前
@matepi #6 V 站还天天有人说「 MD5 加密」呢,这找谁说理去
|
151
dreamage 248 天前
草台班子:能用就行了
|
152
qiyilai 248 天前
怎么招进来的
|
153
daozun 248 天前
挂我是吧,晚上别睡太死-.-
|
154
bk201 248 天前
3 年 java 和刚毕业也没啥区别。很多好几年都没入门。
|
155
Mrzhs 248 天前
推荐他去看看 JWT, 这样你就是大佬了~
|
156
rahuahua 248 天前
提供一个思路,如果觉得同事水平特别菜,你要想想你是不是该挪窝了,如果挪不到更好的窝就忍着吧
|
157
ljyst 248 天前
@x2420390517 你对。我不懂!现在 cookie 验证都是存在数据库里的不然重启又得重新登录,不是刷新跳转。
|
158
accelerator1 248 天前 3
@supuwoerc LZ 明明想说的是“这种事情只可能发生在一个实习生身上”,不是“所有实习生都会犯这个错”,强行给楼主戴帽子么。。。
|
160
ishalla 248 天前
前几天项目准备上线,gate review 的时候发现 URL 里带 secret 呢。。
就是链接直接就 https://xxxxxxxclientid=XXXXX&clientsecret=XXXXXXX 这还是合作了 10+年的 vendor ,OP 有没有觉得安慰一点? 本安全架构已经看得麻木了。。 |
161
icoomn 248 天前
加密,签名,证书,权限这些,不是真的做过强业务,很多人整不来
|
162
xinshoushanglu 248 天前
单纯的菜而已,没人教他,可能这人性格 也不太愿意学,整体基础就不行,这样的人很多。
只是大多数项目 基本活不到有 多少量的用户的阶段,也就发现不了这些安全问题了,干多少年也就这么糊弄过去 |
163
0xC000009F 248 天前
虽然知道 base64 是编码,但平时沟通的时候经常习惯称 base64 加密。导致有次给国外同事发邮件,习惯性用了"encryption",他回邮件洋洋洒洒给我写了一堆"encryption"和"encoding"的区别。😂
|
164
sampeng 248 天前
非常同情 LZ 的心情。但是你不是她他领导。你要说了他肯定急
|
167
xhatt510 OP @DaneWalters 楼上有个和你一样的,满脑子 HS
|
168
hnliuzesen 248 天前
@xhatt510 哈哈,深有同感
|
169
chenstor 248 天前
又不是不能用。。。。。。
果然很优秀,刷新认知了 |
170
listenEcho 248 天前
哈哈,我目前做的业务也是发现了这个问题,很敏感的数据在 URL 上传递,也是用的 base64
|
171
c3de3f21 248 天前
啊?我从来都是明文存 token 明文加到 header 里。。。。。。
|
172
simo 248 天前
惭愧,08 年左右刚开始接触后端开发,也在数据库存明文密码。当时刚学后端开发没多久,对安全方面确实完全不懂,看别人的源码后,才明白相关的一些知识。也怪当时没被脚本小子们搞过,不然也能提早接受教育。
那会教程少,运气好的话,有人带带,不然只能论坛、搜索引擎、博客碎片化学习。我当时是没碰到过系统的教程,基本都是一个个知识点积累起来,然后看书串知识点。 |
175
hun2008hun 248 天前
还行,上次听说公司有个人登陆用户是根据前端传的 uid=xxx 来获取
|
176
EndlessMemory 248 天前
整笑了,这他妈太离谱了
|
177
yosoroAida 248 天前
@bk201
别说 3 年了,我见过 6 年的,水平跟刚毕业的没啥区别 |
178
Hudiebbk 248 天前
这个世界就是个草台班子
|
179
Email 248 天前
不以善小而不为 不以恶小而为之
|
180
mark2025 248 天前
如果口令里面有个|就好玩了,比如 admin|pass123|456|1713771788
|
181
pwelyn 248 天前
|
182
ZXiangQAQ 248 天前
羡慕啊,我也想这么写,我们这接口都走加密的,巨恶心,先生成 sm4 密钥,然后使用 sm2 加密,sm3 对加密的参数签名,调用服务端协商密钥,后续调用都得加密
|
183
vsheyan 248 天前
引出一堆人 battle,小板凳观战 吃瓜👀
|
184
cndns 248 天前 via Android
叫公司做个三级等保,就要整改。
|
185
456vv 248 天前
@jinlliming2 登录后依然存留用户密码是不对的,后转为 token 没有时效也不对。要是 token 与明文密码无区别,惟一只是增加了技术门槛,对攻击者来说有什么区别! session_token 和 refresh_token 只用于不同渠道的权限上使用。在登录方面我只指望于 ssl ,防中间人就可以。在前端各总加密都没卵用,要是自身中毒了,反正你卡里余额也不多。哈哈。
|
186
456vv 248 天前
@lidongyooo 讲个加密的 Base64 方法给他们学学
|
187
wanguorui123 248 天前 via iPhone
BasicAuth 而已
|
188
asmoker 248 天前 via Android
不合规 ༄༅
|
189
moqsien 247 天前
以前,看到写得烂的代码,尤其是 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 |
190
yao00jun 247 天前
学习了
|
191
DesnLee 247 天前
基础不牢是这样的,
|
192
dododada 247 天前
其实还是公司安全培训的问题,前司一次弱密码警告,二次弱密码罚款,三次就开了
|
194
dododada 247 天前
@xhatt510 开了吧,明文和弱密码是必须禁止的,无论内外什么环境,即使物理隔离,因为人是最大的安全隐患。以前有个同事的 mac 中了毒,他把公司的苹果账号存在本地了,然后我们就见识了一下供应链攻击,前后两分钟,公司账号下的 app 以及账号上的钱就被转到捷克去了,虽然没多少钱,但是真的不安全
|
195
xhatt510 OP @dododada #194 你猜我要是有本事开人,我的标题是不是应该叫:“逆天!干了 3 年的同事用 base64 编码做 token 并且把密码也放了进去。要不要开了?”
|
196
lbunderway 247 天前
自己搞一套 base64 的字符集也不是不可以
|
197
EJW 247 天前
这帖还挺刷新我认知的,这么多人觉得无所谓
|
198
forty 247 天前
很多半懂不懂的人在说“base64 加密”,编码就编码,非要说什么加密,仿佛一眼看不出来明文的就是加密,导致一些小白也被带偏了。哈希摘要也同理,有人就喜欢说“md5 加密”。
|
199
igeeky 247 天前
用户的密码存储密文是不符合国家信息安全相关的法律规定的. (什么法不记得了, 但是国家肯定有要求). 你们还是做信息安全的, 支持开除.
|
200
leaves615 247 天前
这系统有攻击价值吗?
|