中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

網(wǎng)站未做安全隱患檢測(cè)怎么拿shellseo的培訓(xùn)課程

網(wǎng)站未做安全隱患檢測(cè)怎么拿shell,seo的培訓(xùn)課程,建立各抗日黨派什么的主張,51找呀模板網(wǎng)1.問(wèn)題 賬密登錄方式中用戶(hù)輸入密碼后,把賬號(hào)、密碼通過(guò)http傳輸?shù)胶蠖诉M(jìn)行校驗(yàn),然而密碼屬于敏感信息,不能以明文傳輸,否則容易被攔截竊取,因此需要考慮如何安全傳輸密碼 2.解決方案 使用rsa加密方式,r…

1.問(wèn)題

賬密登錄方式中用戶(hù)輸入密碼后,把賬號(hào)、密碼通過(guò)http傳輸?shù)胶蠖诉M(jìn)行校驗(yàn),然而密碼屬于敏感信息,不能以明文傳輸,否則容易被攔截竊取,因此需要考慮如何安全傳輸密碼

2.解決方案

使用rsa加密方式,rsa屬于非對(duì)稱(chēng)加密,特點(diǎn)就是公鑰加密私鑰解密

2.1后端生成公鑰私鑰

生成公私鑰,把公鑰返回給前端,私鑰用redis緩存

ManagerController.java

    @GetMapping("/key")public ResponseEntity<ApiResponse> key(@RequestParam("loginNo") String loginNo) {String key = managerService.generateKey(loginNo);return ApiResponse.success(key);}

ManagerServiceImpl.java

    @Overridepublic String generateKey(String loginNo) {QueryWrapper<Manager> wrapper = new QueryWrapper<>();wrapper.eq("loginNo", loginNo);Manager entity = this.getOne(wrapper);if (Objects.isNull(entity)) {throw new CodeException("用戶(hù)不存在:loginNo=" + loginNo);}try {KeyPair keyPair = RSAUtil.generateKeyPair();String publicKey = RSAUtil.getPublicKey(keyPair);String privateKey = RSAUtil.getPrivateKey(keyPair);log.info("publicKey={}", publicKey);log.info("privateKey={}", privateKey);String redisKey = RedisKey.MANAGE_LOGIN_RSA_PRIVATEKEY + "$" + loginNo;// 清除緩存redisService.del(redisKey);// 私鑰添加到緩存redisService.set(redisKey, privateKey, 5, TimeUnit.MINUTES);return publicKey;} catch (Exception e) {log.error("生成rsa密鑰失敗", e);}return null;}

RSAUtil.java

public class RSAUtil {private static final Charset CHARSET = StandardCharsets.UTF_8;private static final String ALGORITHM = "RSA";/*** 生成密鑰對(duì)* @return* @throws NoSuchAlgorithmException*/public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);keyPairGenerator.initialize(1024);return keyPairGenerator.generateKeyPair();}/*** 生成公鑰* @param keyPair* @return*/public static String getPublicKey(KeyPair keyPair) {PublicKey publicKey = keyPair.getPublic();byte[] bytes = base64Encode(publicKey.getEncoded());return new String(bytes, CHARSET);}/*** 生成私鑰* @param keyPair* @return*/public static String getPrivateKey(KeyPair keyPair) {PrivateKey privateKey = keyPair.getPrivate();byte[] bytes = base64Encode(privateKey.getEncoded());return new String(bytes, CHARSET);}/*** base64加密* @param bytes* @return*/public static byte[] base64Encode(byte[] bytes) {return Base64.getEncoder().encode(bytes);}/*** base64解密* @param bytes* @return*/public static byte[] base64Decode(byte[] bytes) {return Base64.getDecoder().decode(bytes);}/*** base64解密* @param src* @return*/public static byte[] base64Decode(String src) {return Base64.getDecoder().decode(src);}/*** 解密* @param key* @param data* @return* @throws NoSuchAlgorithmException* @throws InvalidKeySpecException* @throws NoSuchPaddingException* @throws InvalidKeyException* @throws IllegalBlockSizeException* @throws BadPaddingException*/public static String decrypt(String key, String data) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {byte[] bytes = base64Decode(key);PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(bytes);KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");cipher.init(Cipher.DECRYPT_MODE, privateKey);return new String(cipher.doFinal(base64Decode(data.getBytes(CHARSET))), CHARSET);}

2.2前端使用公鑰加密

安裝這個(gè)依賴(lài)

npm install jsencrypt@3.2.0
import JSEncrypt from 'jsencrypt';// key為后端返回的公鑰,this.form.password為明文密碼
const jsEncrypt = new JSEncrypt();
jsEncrypt.setPublicKey(key);
// pwd為加密后的密碼
var pwd = jsEncrypt.encrypt(this.form.password);

2.3后端使用私鑰解密

從redis獲取私鑰,用私鑰解密,得到明文后和數(shù)據(jù)庫(kù)保存的密碼比對(duì),數(shù)據(jù)庫(kù)的密碼是以用戶(hù)id為鹽值對(duì)明文密碼作md5加密,相同則放行,否則報(bào)錯(cuò),注意登錄成功的話(huà)需要把redis的密鑰移除

ManagerController.java

    @PostMapping("/login")public ResponseEntity<ApiResponse> login(@RequestParam("loginNo") String loginNo, @RequestParam("password") String password)throws Exception {UserDTOWithToken dto = managerService.login(loginNo, password);return ApiResponse.success(dto);}

ManagerServiceImpl.java

    @Overridepublic UserDTOWithToken login(String loginNo, String password) throws Exception {QueryWrapper<Manager> wrapper = new QueryWrapper<>();wrapper.eq("loginNo", loginNo);Manager entity = this.getOne(wrapper);if (Objects.isNull(entity)) {throw new CodeException("用戶(hù)不存在:loginNo=" + loginNo);}String redisKey = RedisKey.MANAGE_LOGIN_RSA_PRIVATEKEY + "$" + loginNo;// 從緩存獲取私鑰String privateKey = (String) redisService.get(redisKey);if (StrUtil.isEmpty(privateKey)) {throw new CodeException("私鑰不存在");}// 用私鑰解密String realPassword = RSAUtil.decrypt(privateKey, password);log.info("realPassword={}", realPassword);// 校驗(yàn)密碼Digester digester = new Digester(DigestAlgorithm.MD5);digester.setSalt(entity.getId().getBytes(StandardCharsets.UTF_8));String encodePassword = digester.digestHex(realPassword);log.info("encodePassword={}", encodePassword);if (!encodePassword.equals(entity.getPassword())) {throw new CodeException("密碼錯(cuò)誤");}//從認(rèn)證服務(wù)獲取tokenResponseEntity<ApiResponse> responseEntity = authClient.token(AuthConst.PASSWORD_GRANT_TYPE, AuthConst.ADMIN_CLIENT_ID,AuthConst.ADMIN_CLIENT_SECRET, null, loginNo, password);ApiResponse response = responseEntity.getBody();TokenDTO tokenDTO = response.toObject(TokenDTO.class);if (Objects.isNull(tokenDTO)) {throw new CodeException("獲取token失敗:" + response.getMessage());}UserDTOWithToken dto = new UserDTOWithToken();dto.setUserId(entity.getId());dto.setToken(tokenDTO);entity.setLoginTime(LocalDateTime.now());Integer loginCount = entity.getLoginCount();entity.setLoginCount(Objects.isNull(loginCount) ? 1 : loginCount + 1);entity.setUpdateTime(LocalDateTime.now());this.updateById(entity);// 成功則清除緩存的私鑰redisService.del(redisKey);return dto;}

3.總結(jié)

非對(duì)稱(chēng)加密還有其它算法,rsa是其中一種

后端存儲(chǔ)私鑰除了redis也可以用其它緩存工具如J2Cache

http://m.risenshineclean.com/news/59591.html

相關(guān)文章:

  • 江蘇官網(wǎng)建設(shè)公司代碼優(yōu)化
  • 有沒(méi)有做鏈接的網(wǎng)站企業(yè)網(wǎng)站多少錢(qián)一年
  • 網(wǎng)絡(luò)培訓(xùn)研修總結(jié)北京seo優(yōu)化排名推廣
  • 南寧建站價(jià)格近期網(wǎng)絡(luò)輿情事件熱點(diǎn)分析
  • 企業(yè)網(wǎng)站開(kāi)發(fā)報(bào)價(jià)形式英文seo外鏈發(fā)布工具
  • 網(wǎng)站建設(shè)百度推廣防疫管控優(yōu)化措施
  • 南昌做網(wǎng)站哪家好唐山百度提升優(yōu)化
  • 建站什么程序好seo排名的公司
  • 數(shù)據(jù)庫(kù)做網(wǎng)站看今天的新聞
  • 網(wǎng)站建設(shè)需要數(shù)據(jù)庫(kù)嗎國(guó)內(nèi)企業(yè)網(wǎng)站模板
  • 網(wǎng)站關(guān)鍵詞推廣優(yōu)化如何找客戶(hù)資源
  • 滬上裝修排名前十有哪些品牌優(yōu)化問(wèn)題
  • 有哪些網(wǎng)站可以做簡(jiǎn)歷2024年新冠疫情最新消息今天
  • 永州市住房和城鄉(xiāng)建設(shè)廳網(wǎng)站google關(guān)鍵詞優(yōu)化排名
  • wordpress摘要排除代碼大地seo
  • 企業(yè)自己如何做網(wǎng)站推廣正規(guī)培訓(xùn)機(jī)構(gòu)有哪些
  • 什么網(wǎng)站可以幫人做ppt賺錢(qián)推廣鏈接
  • 成都網(wǎng)站開(kāi)發(fā)培訓(xùn)機(jī)構(gòu)搜狗收錄提交入口
  • 做文獻(xiàn)ppt模板下載網(wǎng)站有哪些鏈接買(mǎi)賣(mài)價(jià)格
  • 網(wǎng)站地圖怎么做html公司員工培訓(xùn)內(nèi)容有哪些
  • 怎么免費(fèi)建立一個(gè)網(wǎng)站蕁麻疹怎么治療能除根
  • 體育彩票網(wǎng)站開(kāi)發(fā)方案威海seo優(yōu)化公司
  • 訪問(wèn)美國(guó)網(wǎng)站 dns設(shè)置百度指數(shù)教程
  • 注冊(cè)網(wǎng)站域名多少錢(qián)一年搜索引擎優(yōu)化特點(diǎn)
  • 做數(shù)據(jù)同步的兩個(gè)網(wǎng)站怎么建立一個(gè)自己的網(wǎng)站
  • 聊天網(wǎng)站制作教程電腦優(yōu)化工具
  • 軟件開(kāi)發(fā)者怎么賺錢(qián)優(yōu)化推廣網(wǎng)站怎么做
  • 手機(jī)app網(wǎng)站建設(shè)seo推廣價(jià)格
  • 易銷(xiāo)云建站公司成都網(wǎng)站seo推廣
  • 購(gòu)物網(wǎng)站開(kāi)發(fā)的意義和目的滄州seo包年優(yōu)化軟件排名