面试官:登录密码明文传输?

本文结合真实企业开发案例,让Java初学者了解加密技术的背景,详解摘要算法、对称加密和非对称加密三种加密方式及其在不同场景的应用,探讨加密技术在保护数据安全中的重要性。

引言

某日,阿樂跑去面试!

  • 面试官:“来,聊聊你负责的项目,介绍一下主要功能是做什么?”

  • 阿樂:“哎哟,这可是个大项目啊!主要就是负责让大伙儿轻松登录。我们用了当下最流行的JWT技术,用户可以通过账号密码方式进行登录。”

  • 面试官听后微微一笑:“听起来不错。那么,你们的网站已经上线了?那不如现在就给我们演示一下吧。”

  • 阿樂:“没错,已经准备就绪,等待大家的检阅!首先,我们来到了网站的登录页面,你看这里,我们先使用账号密码登录 ...”

  • 面试官突然打断我:“等等!你刚刚说账号密码登录?你们网站的密码是明文传输?”

背景

在传统软件开发中,数据传输往往依赖于HTTPS协议来保证数据的安全性,但网络通信并不总是安全的。如果前端未对敏感信息进行加密传输,则可能会被恶意第三方截取、篡改或窃取。

另一方面,如果未加密的明文信息被记录在数据库或日志信息当中,当服务器被恶意网络攻击、黑客入侵,导致数据库拖库,用户敏感信息也极易泄露。

在2018年Facebook约8700万用户的数据被非法获取,用于政治广告,公司因而受到巨大的舆论和法律压力。

数据加密

数据加密技术来源于《信息密码学》,密码学最基础的分支有三个,第一个是单向 散列函数(🔍又称为报文摘要函数算法),第二个是对称密码技术,第三个是非对称密码技术

  • 单向散列函数:当前最流行的摘要算法有MD5、SHA256、国密 SM3等等,该类算法主要应用场景包含数据完整性验证、密码存储、数字签名等等。我们应用开发中最熟悉的就是MD5对用户密码加密存储到数据库。(tips:2004年我国密码学家王小云破解了MD5算法,业界已逐渐转向其他替代算法!)

  • 对称密码技术:对称加密在加密和解密时使用相同的密钥,常用的算法有DES、AES、国密SM1和SM4等,其常用于保护敏感数据的机密性、文件加密和存储、网络通信加密。

  • 非对称密码技术:非对称加密有两个密钥,一个叫“公钥”(public key),一个叫“私钥”(private key)。两个密钥是不同的,“不对称”,公钥可以公开给任何人使用,而私钥必须严格保密。常用的算法有DH、DSA、RSA、SM2等,其应用场景主要有数字签名、身份认证和安全通信、加密货币等。

前后端请求交互加密

回到开头的面试场景,在真实企业开发中,为了保护用户的敏感数据,往往在前端发起请求时就需要将数据加密,这样数据在网络传输过程中,已经是密文,即使信息被黑客拦截,也无法对其进行有效解析、篡改。

之后密文发送到服务端,服务端持有密钥,即可对加密数据进行解密!

相信很多加入我们“黑马智学伴侣”的知识星球的球友,都已经使用过“黑马星云AI助理”。那我们就以该网站的账号密码登录功能进行分析!

该功能使用RSA非对称加密,流程如下:

  1. 用户在登录页面输入账号密码

  2. 前端向后端发起请求获取加密公钥(RSA)

  3. 后端生成一组RSA密钥对,将公钥返回给前端

  4. 前端使用RSA公钥将密码进行加密

  5. 前端向后端发起登录请求,发送密文信息

  6. 后端使用RSA私钥对密码进行解密,获取明文密码

了解完上面的前端加密流程,球友们可以登录“黑马星云AI助理”实际体验,在浏览器开发者工具中查看网络请求,看一下你的登录密码在请求参数中是否为密文啦!

密码加密存储

接下来,登录信息传输到后端,又发生了什么呢?球友们在浏览器的控制台中无法看到了,就让樂哥带大家继续学习!

上文我们讲到我们通常用摘要算法进行密码的存储,还以“黑马星云AI助理”项目为例,本项目使用了BCrypt加密。那为什么我们通常选择摘要算法对密码加密呢?主要有以下原因:

  • 安全性:密码如果明文存储,将面临巨大的安全风险。而通过摘要算法(如SHA-256、MD5等)对密码进行加密,即使数据库被窃取,攻击者也只能获得密码的哈希值。

  • 不可逆性:摘要算法是单向的,也就是说从哈希值无法反推出原始的密码。

  • 存储效率:与明文密码相比,哈希值通常更短,这减少了存储空间的需求。

下面摘取注册与登录校验代码片段供球友们学习:

注册功能:

public void register(CustomerUserRegisterDto customerUserRegisterDto) {
    //将密码进行解密,校验密码强度,长度为8-20位,必须同时含有一位数字和一位字母
    String password = securityService.decryptByPrivateKey(customerUserRegisterDto.getPassword());
    boolean passwordValid = password.length() >= 8 && password.length() <= 20 && ReUtil.contains(RegexConstants.PASSWORD, password);
    if (!passwordValid) {
        throw new BaseException(BasicEnum.PASSWORD_FORMAT_ERROR);
    }
​
    .....其他业务逻辑....
​
    //构建普通用户数据,并存到数据库
    CustomerUser customerUser = new CustomerUser();
    customerUser.setId(id);
    customerUser.setNickname(nickName);
    customerUser.setAvatar(avatar);
    customerUser.setPhone(phoneEncrypt);
 //下面DigestUtil为hutool工具类,使用BCrypt加密算法
    customerUser.setPassword(DigestUtil.bcrypt(password));
    baseMapper.insert(customerUser);
}

登录功能:

public CustomerLoginVo phonePasswordLogin(PhonePasswordLoginDto phonePasswordLoginDto) {
    //将密码进行解密,校验密码格式
    String password = securityService.decryptByPrivateKey(phonePasswordLoginDto.getPassword());
    if (password.length() < 8 || password.length() > 20) {
        throw new BaseException(BasicEnum.PHONE_OR_PASSWORD_ERROR);
    }
​
    .....其他业务逻辑....
​
    //校验密码正确性,第一个参数为明文,第二个参数来自数据库是密文
 //下面DigestUtil为hutool工具类,使用BCrypt校验方法
    boolean isRight = DigestUtil.bcryptCheck(password, customerUser.getPassword());
    if (!isRight) {
        throw new BaseException(BasicEnum.PHONE_OR_PASSWORD_ERROR);
    }
​
    return new CustomerLoginVo(jwtTool.createAccessToken(customerUser.getId()), jwtTool.createRefreshToken(customerUser.getId()));
}

敏感数据加密存储

前面我们也提到一旦服务器遭遇恶意入侵,导致数据库拖库,用户敏感信息如果明文存储也极易泄露。因此,我们也需要对如用户手机号、身份证号、银行卡号等等敏感信息进行加密存储。

我们仍然以“黑马星云AI助理”项目为例,带球友们学习。本项目中注册登录经常要使用手机号,那么手机号就是敏感数据,该数据应该如何存储呢?综合考虑各项因素我们选择了AES对称加密算法,主要有以下原因:

  • 高安全性:AES是一种被广泛认可和使用的加密算法,被众多国际标准采纳,具有非常高的安全性。

  • 出色的性能:与一些其他加密算法相比,AES算法在计算速度上具有优势。

  • 广泛支持:AES算法被几乎所有主流的编程语言和平台所支持,包括Java。

  • 适用场景广泛:由于对称加密算法在相同的密钥下进行加密和解密操作,所以适用于那些对数据保密性要求较高,同时对性能有一定要求的场景。

具体到项目实践,可以选择在应用程序中直接编码实现加解密过程,或者如果使用MySql数据库直接提供了加解密函数。所以具体实践根据自己的项目情况而定!下面我们给出程序编码实现方式,如果使用其他方式的球友请查阅相关文档。

登录功能:

public void register(CustomerUserRegisterDto customerUserRegisterDto) {
    //校验手机号格式
    if (!PhoneUtil.isMobile(customerUserRegisterDto.getPhone())) {
        throw new BaseException(BasicEnum.PHONE_FORMAT_ERROR);
    }
​
    //校验手机号是否已注册
 //securityService.phoneEncrypt该方法见下面代码
    String phoneEncrypt = securityService.phoneEncrypt(customerUserRegisterDto.getPhone());
    boolean isExists = checkDuplicatedPhoneUser(phoneEncrypt);
    if (isExists) {
        throw new BaseException(BasicEnum.PHONE_USER_EXISTS);
    }
​
    .....其他业务逻辑....
​
    //构建普通用户数据,并存到数据库
    CustomerUser customerUser = new CustomerUser();
    customerUser.setId(id);
    customerUser.setNickname(nickName);
    customerUser.setAvatar(avatar);
    customerUser.setPhone(phoneEncrypt);
    customerUser.setPassword(DigestUtil.bcrypt(password));
    baseMapper.insert(customerUser);
}

手机号加密方法:

public String phoneEncrypt(String phone) {
    // 检查手机号是否为空或仅包含空白字符
    if (CharSequenceUtil.isBlank(phone)) {
        return null;
    }
​
    // 使用AES算法对手机号进行加密,密钥来自secureKeyProperties配置中的phoneKey
 //SecureUtil使用的hutool工具类
    AES aes = SecureUtil.aes(Base64.decode(secureKeyProperties.getPhoneKey()));
    return Base64.encode(aes.encrypt(phone));
}

手机号解密方法:

public String phoneDecrypt(String encryptPhone) {
    // 检查传入的加密电话号码是否为空
    if (CharSequenceUtil.isBlank(encryptPhone)) {
        return null;
    }
​
    // 使用预设的密钥初始化AES加密对象
 //SecureUtil使用的hutool工具类
    AES aes = SecureUtil.aes(Base64.decode(secureKeyProperties.getPhoneKey()));
    return new String(aes.decrypt(encryptPhone));
}

总结

加密是一种保护数据安全的手段,将原始数据转换为密文,增加数据在传输和存储过程中被窃取、篡改或破解的难度,保护用户数据的安全性,提升系统的安全性和可信度。

企业中真实开发中需要的不仅仅是业务实现,还要考虑到安全因素。加密算法的应用非常的广泛,摘要算法、对称加密、非对称加密三种加密方式有不同的应用场景,需要根据实际情况在开发中使用。

逆袭面试

第二天阿樂继续参加面试,让我们一起欣赏阿樂的表演😎

  • 面试官:“来,介绍一下你负责业务中使用的安全技术吧。”

  • 阿樂自信满满地回应:“我在项目中负责的安全技术主要是数据加密,主流的摘要算法、对称加密、非对称加密在业务中均有使用,主要集中在登录和用户信息业务方面。”

  • 面试官点点头:哦?具体是怎么应用的呢?

  • 阿樂开始详细解释:“首先说摘要算法吧,常见的有黑客攻击会导致数据库拖库。所以在登录业务中使用了BCrypt摘要算法对密码预处理,存到数据库的数据是无法解析的密文。”

  • 面试官追问道:“那在https请求中是否也可能会密码泄露?”

  • 阿樂笑着摇了摇头:“一般来说,https请求就是安全的,它已经综合使用了对称加密和非对称加密技术,细节我们就不在这里讲了。当然我们保持严谨的态度,前端发送登录请求之前,就先使用RSA非对称加密对密码进行了加密,即使信息被恶意第三方截取,他们也只能望‘密’兴叹。”

  • 面试官点点头,表示认可:“那对称加密在业务中有没有具体的应用场景呢?”

  • 阿樂不假思索地回答:“当然,对于用户的手机号、身份证号等等敏感数据,不仅要存为密文,还需要解析出来使用,同时还要保证一定性能,所以采用了AES对称加密算法,使数据安全性和系统可用性之间达到完美的平衡。”

超值福利

最后,樂哥今天还给大家带来了超值福利,黑马程序员最新推出的知识星球:《黑马智学伴侣》。不仅文中我们提到的专属“黑马星云AI助理”,更有专享“AI练测平台”,黑马名师实时答疑,现在加入享最低折扣价399元/年

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值