web安全渗透扫描-已解密的登录请求
keyword:web渗透检测,安全检测,AppScan
web渗透检测 渗透的本质是漏洞。web渗透检测也即web漏洞检测。
AppScan安全扫描报告
如下是问题类型为“已解密的登陆请求”中提到的问题-详情
改造方案:
服务端添加获取加密秘钥的接口:/getLoginSignKey。
前端在调用登陆接口时,先调用 /getLoginSignKey 接口,获取加密key,对用户登陆密码进行加密。然后,调用登陆接口时,上送加密后的用户密码参数。
服务端登陆接口在获取到登陆请求参数时,先对密码做解密,再执行原有验证逻辑。
改造代码:
/getLoginSignKey 接口
private static final String LOGIN_SIGN_KEY_CACHE = "loginSignKeyCache:"; // 获取登录签名key @RequestMapping(value = "/getLoginSignKey", method = RequestMethod.POST) public Result<String> getLoginSignKey(@RequestBody SysLoginModel sysLoginModel) throws Exception { String cacheKey = LOGIN_SIGN_KEY_CACHE + sysLoginModel.getUsername(); Object signCache = redisUtil.get(cacheKey); if (ObjectUtil.isNotNull(signCache)) { return Result.successWithMsg(signCache.toString()); } KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); // 初始化密钥对生成器,密钥大小为96-1024位 keyPairGen.initialize(1024, new SecureRandom()); // 生成一个密钥对,保存在keyPair中 KeyPair keyPair = keyPairGen.generateKeyPair(); // 得到公钥字符串 String publicKeyString = com.emax.zhenghe.common.util.Base64.encode(keyPair.getPublic().getEncoded()); // 得到私钥字符串 String privateKeyString = Base64.encode(keyPair.getPrivate().getEncoded()); redisUtil.set(cacheKey, privateKeyString, 7 * 24 * 60 * 60); //7天有效 return Result.successWithMsg(publicKeyString); }
登陆接口改造
// 登录接口 @RequestMapping(value = "/login", method = RequestMethod.POST) public Result<JSONObject> login(@RequestBody SysLoginModel sysLoginModel) { Result<JSONObject> result = new Result<JSONObject>(); String username = sysLoginModel.getUsername(); String password = ""; log.info("用户登陆--系统登录--/sys/login--username={}", username); // 设置登录次数限制 Result loginLimitResult = loginLimitValidate(sysLoginModel.getUsername()); if (!loginLimitResult.isSuccess()) return loginLimitResult; //密码加密验签: String signCacheKey = LOGIN_SIGN_KEY_CACHE + sysLoginModel.getUsername(); Object signPrivateKeyCache = redisUtil.get(signCacheKey); if (ObjectUtil.isNull(signPrivateKeyCache)) { result.error500("非法请求!"); return result; } try { password = new String(RSAUtils.decryptByPrivateKey(Base64.decode(sysLoginModel.getPassword()), signPrivateKeyCache.toString())); } catch (Exception e) { log.info("login--username={},解密失败", sysLoginModel.getUsername()); result.error500("非法请求!"); return result; } ..... 原有登陆逻辑 }
前端页面请求的网络调用:
根据登陆用户去拿key
调用登陆接口,密码是加密后的密文
当看到一些不好的代码时,会发现我还算优秀;当看到优秀的代码时,也才意识到持续学习的重要!--buguge
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/buguge/p/16167320.html