关于前后端密码传输与存储?

2021-07-14 08:45:14 +08:00
 daguaochengtang
登录时,前端调用接口传的密码参数(加密,不加密),以及后端存储密码(加密,不加密)。你们是怎么做的?
排列组合有 4 种:
1. 前端加密,后端加密
2. 前端加密,后端不加密
3. 前端不加密,后端加密
4. 前端不加密,后端不加密
我们目前采用的是第 1 种,用户传输加密后的密码直接和库里加密后的密码比对。但是我偶然听闻了之前 csdn 发生过用户密码大量泄漏的事件。就想到其实前后端都加密的话,如果数据库密码泄露,不就能直接调接口了吗?
所以我想,是不是第 3 种要安全一点,前端传输名文,服务端拿到名文密码后,加密后与库里密码比对。这样即使数据库密码泄露,也无法得知密码名文,就无法调接口了。
当然,我知道,如果数据库都泄露了,光凭这一点已经无法谈及安全问题了。只是想就事论事,想知道你们是怎么做的,这个是否有业内约定俗成的标准?
6372 次点击
所在节点    问与答
51 条回复
marcomarco
2021-07-14 08:53:49 +08:00
我们一般是 3,然后传输过程加密,让人拦截不到传输内容。
marcomarco
2021-07-14 08:55:29 +08:00
@marcomarco 前端也加密的话,那如果是网页端岂不是加密方式都直接泄露了?
sutra
2021-07-14 08:57:54 +08:00
前端加密的意义何在?
mingl0280
2021-07-14 09:00:19 +08:00
密码不应当存储为明文或可逆加密的密文。
cmdOptionKana
2021-07-14 09:00:43 +08:00
前端不加密,走 https,后端也不加密,只保存 hash
Tardis233
2021-07-14 09:01:26 +08:00
前后端加密肯定不是一套加密方案...不管前加不加后端肯定得独立一套方案
feikeq
2021-07-14 09:03:17 +08:00
通常是第 3 种,前端不加密走 HTTPS,后端增添加密因子进行特定算法法加密
InDom
2021-07-14 09:09:48 +08:00
前端可逆加密,后端不可逆加密。

如果传输协议是 https / tls 保护的,前端可以不加密。
daguaochengtang
2021-07-14 09:10:09 +08:00
@feikeq 明白了
wangxiaoaer
2021-07-14 09:11:17 +08:00
跟楼上一样,前端不加密,但是走 https,后台拿到原始密码后给每个用户生成一个独立的盐( salt ),然后再把原始密码和盐一起做 hash,hash 结果存到数据库。 验证的时候,做同样的 hash 运算,跟数据库里面的 hash 结果比对。

这样的好处是即使数据库泄露,也不会暴露用户的原始密码。
dxatgp02
2021-07-14 09:11:48 +08:00
学习学习
dzdh
2021-07-14 09:16:16 +08:00
不用 argon2 的都是耍流氓
soulzz
2021-07-14 09:20:12 +08:00
直接 Spring Security 一套用上,加密方式选择 Bcrpt
CodeCodeStudy
2021-07-14 09:27:02 +08:00
用 BCrypt 啊
Java

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
new BCryptPasswordEncoder().encode(password);
new BCryptPasswordEncoder().matches(rawPassword, encodedPassword);

PHP
echo password_hash(‘123456’, PASSWORD_DEFAULT); // 获取密码
var_dump(password_verify(‘123456’, '$2a$10$QoH8aP4NjR.h6IJwQ4S9l.8xbryqH28UtaorHeF3uBk7h72O4J4lu')); // 校验密码
emeab
2021-07-14 09:30:13 +08:00
有 TLS 前端不加密也行.
z960112559
2021-07-14 09:32:25 +08:00
前端 AES 加密
后端 AES 解密后再 MD5()
数据库 MD5 存储
再加 HTTPS
securityCoding
2021-07-14 09:34:37 +08:00
前端加密就是在搞自己
xmumiffy
2021-07-14 09:44:04 +08:00
安全的储存密码是为了不泄露用户明文密码,防止用户使用相同密码的其他服务被社工攻击。而不是为了防止调用你的接口,你密码表都被拖了,你还谈啥接口安全,直接拿你表里的 token 登入就行了。
不过一和三都能防止你所提到的问题
abccccabc
2021-07-14 09:48:30 +08:00
前端页面直接将密码加密后,传到后端,后端拿着用户名与密码去数据库匹配。

这样被社工的几率小。首先密码长度是固定的,先判断密码长度,可以过滤一部分社工。另外,密码加密传输,相对明文存储要安全很多。
expy
2021-07-14 09:51:46 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/789385

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX