Java 业务开发常见错误 100 例
朱晔
贝壳金服资深架构师
51940 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
代码篇 (23讲)
Java 业务开发常见错误 100 例
15
15
1.0x
00:00/00:00
登录|注册

30 | 如何正确保存和传输敏感数据?

你好,我是朱晔。
今天,我们从安全角度来聊聊用户名、密码、身份证等敏感信息,应该怎么保存和传输。同时,你还可以进一步复习加密算法中的散列、对称加密和非对称加密算法,以及 HTTPS 等相关知识。

应该怎样保存用户密码?

最敏感的数据恐怕就是用户的密码了。黑客一旦窃取了用户密码,或许就可以登录进用户的账号,消耗其资产、发布不良信息等;更可怕的是,有些用户至始至终都是使用一套密码,密码一旦泄露,就可以被黑客用来登录全网。
为了防止密码泄露,最重要的原则是不要保存用户密码。你可能会觉得很好笑,不保存用户密码,之后用户登录的时候怎么验证?其实,我指的是不保存原始密码,这样即使拖库也不会泄露用户密码。
我经常会听到大家说,不要明文保存用户密码,应该把密码通过 MD5 加密后保存。这的确是一个正确的方向,但这个说法并不准确。
首先,MD5 其实不是真正的加密算法。所谓加密算法,是可以使用密钥把明文加密为密文,随后还可以使用密钥解密出明文,是双向的。
而 MD5 是散列、哈希算法或者摘要算法。不管多长的数据,使用 MD5 运算后得到的都是固定长度的摘要信息或指纹信息,无法再解密为原始数据。所以,MD5 是单向的。最重要的是,仅仅使用 MD5 对密码进行摘要,并不安全
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 业务开发常见错误 100 例》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(19)

  • 最新
  • 精选
  • 大胖子呀、
    老师说不能直接对密码进行md5加密,那我心想可以加盐,老师又说盐不要写死,我又想可以用用户名作为盐,接着老师就又说不建议用用户名做盐,应该uuid生成,我就想那保存到数据库不也可以被黑客获取到吗?最后老师又说:有的同学可能又要问了…… 可恶啊,这些都在你的计算当中啊!

    作者回复: 哈哈

    4
    37
  • 那时刻
    1.关于日志脱敏,可以在日志处理模块里通过正则表达式对于敏感词比如username匹配后,做模糊字符输出到日志里。 2.https双向认证指的是服务器额外校验客户端证书,方便控制某个接口是否允许客户端访问,用于第三方服务调用。流程上多了客户端提交自己证书和服务器校验证书等步骤。 小伙伴们讨论的云平台使用的secretid和secrestkey。云平台更推荐使用临时的IAM来替代吧。

    作者回复: 嗯,对于logback可以直接实现一个MessageConverter来做脱敏,脱敏的方式可以是屏蔽敏感信息的几位,或者是对敏感信息进行加密输出。

    15
  • 👽
    敏感数据的话,其实还有一个: 就是第三方的一些验证数据。类似于阿里云的Id和key。 我未进行加密保存在配置文件中,并且还将其上传在了GitHub上,按理说,如果Github泄露了,任何人都可以调用我的资源了。因为是透支额度设置的很低,而且余额只有10¥,所以未作安全处理。因为最坏的结果,也就是把我余额全用完。 1,如果需要涉及到加密,我会考虑到分开存储: 可能ID存数据库,Key存本地文件。(鸡蛋分在多个篮子里存放,脱库或者服务器被黑,也只有一部分数据泄露,依然无法使用我的服务) 2,然后加密存放,因为调用服务需要读取,所以必须是可逆的加密算法。增加破译的成本。 3,定期监控,出问题及时发现。

    作者回复: 大家也可以继续探讨一下 SecretID和SecretKey应该怎么保存

    4
    5
  • 旅途
    老师 密码使用对称加密或非对称加密不行吗 使用自己的算法进行加密 别人也破解不了

    作者回复: 不行 源码也泄露了呢

    3
    5
  • Joker
    关于彩虹表的解释在这里:https://www.zhihu.com/question/19790488,简单想象成一个黑盒吧,你传进加密后的密码,就能得到解密后的密码。但是构造这黑盒的过程就比较麻烦了。但是如果密文都是根据一个字符串根据特定的规则得到的字符串,哪怕是根据用户信息来构造一个盐,那么就有很大的概率出现,构造了一个彩虹表就把整个数据库的密码给解密了的情况。构造彩虹表的过程虽然麻烦,却是一劳永逸的,那么就要想一个不那么一劳永逸的方法,所以就出现了每次都用一个随机盐的方式。 因为如果是固定的盐的话,那么黑客得到一套数据库之后,只要构造一套彩虹表就能得到结果了。如果每次的盐都不同,那么黑客就要每次都根据密文和盐构造一套彩虹表。 我就是这么理解的,不知道是否正确。密码学真的难。

    作者回复: 差不多

    3
  • J.Smile
    记得一次面试,别人问我https的原理,其实我是理解的,但是记不住这个过程,怎么办?😂

    作者回复: 自己画一遍流程图

    3
  • Geek
    老师好,保护用户二要素AAD在实际会用在哪些场景中,是否用户忘记了自己设置的AAD就没办法类似于重置密码的方式找回AAD了,也就没办法再解密信息?

    作者回复: 不是找回密码的场景,所谓找回密码是重置密码,这里演示的是保护需要用户授权才能获取的重要信息

    2
    2
  • 👽
    我的理解,没有绝对的安全。现有的一切加密安全措施,其实只是增加破解的难度罢了。真正的安全,还是需要验证码之类的动态验证。 我一直以来,理解的加密就分两种:可逆的,不可逆的。 可逆的:规定了一种规律,只要应用这种规律就可以逆推其原始值。我认为其实雪花算法就是可逆的加密算法。知道其运算规律,也可以逆推其创建时间。虽然明文中无法体现其创建时间。 不可逆的:自己的密码是12,加密后是3,已知了算法是所有数位之和,但是并无逆推出原始数值是111,003,03,102......等。 但是,无论可逆还是不可逆,破解也是寻找其规律罢了。加密其实本质也是,对结果附加运算过程。 原始密码 x+a-b*c?d = 密文x1,在足够多的数据样本的时候,我觉得还是可以逆推出原始数据。(解方程嘛。。。) 我觉得,现在的密码加密,维持个三五年之后,也会被轻易破解。 其实要是简单粗暴一点,就手机验证码登录,就已经基本OK了,大平台似乎也都是这么做的。类似于某里云。在一些不太重要的数据,就处理的可以适当放开一些。

    作者回复: 其实深度学习就是通过大量样本寻找y=f(x)中的函数f,我们想一下,是否有可能通过深度学习来解密/获得密钥呢?

    3
    2
  • 汝林外史
    老师,一般的http访问登录,是不是密码加密需要在客户端做,如果不加密传给服务端的话,那密码不就暴露出来,通过浏览器工具是不是就可以看到form提交的数据?

    作者回复: 客户端做有啥用呢,密钥放哪里,走 HTTPS,要求再高点走 activex 控件

    1
  • kacaric
    请问老师接口能否采用https双向认证保证接口安全,还需要在接口中额外增加签名字段吗?

    作者回复: https确保防止伪造篡改中间人窃取 双向https虽然限制了客户端,但是粒度还是很粗 如果我们还是防止调用方随意调用接口,那么还是需要在业务层进行业务加密和签名

    1
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部