บทความสองสามข้อก่อนหน้าเกี่ยวกับ Servlets ได้จัดเรียงกระบวนการใช้งานง่าย ๆ ของ Servlets บทความถัดไปส่วนใหญ่จะมุ่งเน้นไปที่อินเทอร์เฟซการเข้าถึงแอพมือถือการส่งการเข้ารหัส MD5 ----> การตรวจสอบ SMS ---> push มือถือ ---> การแบ่งปัน ---> แผนที่คลาวด์ Baidu ----> การชำระเงิน ... ธุรกิจของบุคคลที่สาม ... เนื่องจากฉันเป็นมือใหม่ฉันยังเรียนรู้และเขียนในขณะที่เรียนรู้
บทความของวันนี้ส่วนใหญ่เกี่ยวข้องกับการเข้ารหัสของข้อมูลการส่ง Javaservlet การรวมกันของพารามิเตอร์คำขอลูกค้าและจะมาพร้อมกับปัญหาทั้งหมดที่ฉันพบในกลางและการแก้ปัญหา
เนื่องจากอินเทอร์เฟซการเข้าถึงโทรศัพท์มือถือได้รับการเผยแพร่ไม่ว่าอินเทอร์เฟซจะเขียนภาษาใดเราจึงควรใช้มาตรการรักษาความปลอดภัยที่สอดคล้องกัน มิฉะนั้นหลังจากที่ผู้คนรู้จัก URL ของคุณสกัดกั้นคำขอของลูกค้าแล้วแก้ไขพารามิเตอร์การส่งซึ่งจะทำให้เกิดการสูญเสียอย่างมาก อินเทอร์เฟซการเขียน servlet ที่ใช้กันมากที่สุดควรเข้ารหัสข้อมูลที่ส่ง หากเขียนด้วย WebService .NET WCF และเทคโนโลยีอื่น ๆ มันจะเกี่ยวข้องกับการจับคู่ใบรับรอง ...
1. แนวคิดสำหรับการเข้ารหัสและการใช้พารามิเตอร์ข้อมูลที่ร้องขอ
การเข้ารหัสที่นี่ฉันใช้การเข้ารหัส MD5 32 บิต 32 บิตเป็นการเข้ารหัสที่กลับไม่ได้ ด้วยวิธีนี้แม้ว่าจะถูกสกัดกั้นโดยแฮ็กเกอร์ก็ไม่มีทางที่จะถอดรหัสค่า MD5 ที่เราเข้ารหัสลงในสตริงรวมกันเมื่อเราเข้ารหัส แน่นอนว่านี่ไม่ใช่แน่นอน ดูเหมือนว่าผู้เชี่ยวชาญด้านคอมพิวเตอร์บางคนได้ถอดรหัสวิธีการเข้ารหัสของ MD5 ในช่วงไม่กี่ปีที่ผ่านมา แต่ฉันคิดว่าเทคโนโลยีอาจไม่ได้รับการเผยแพร่ตามความประสงค์และแม้ว่าจะมีการประกาศ แต่ก็ไม่ใช่สิ่งที่คนธรรมดาสามารถเข้าใจได้ มิฉะนั้นถ้าคุณแค่ถามโปรแกรมเมอร์คุณยังคงใช้การเข้ารหัส MD5 อยู่หรือไม่? คำตอบคือไม่แน่นอน
1. ก่อนอื่นให้ฉันพูดถึงการรวมกันของพารามิเตอร์คำขอของฉัน เนื่องจากสิ่งนี้เกี่ยวข้องกับการเข้ารหัส MD5 เราต้องตอบกลับโทเค็นสองโทเค็นหลังจากผู้ใช้เข้าสู่บัญชีโดยใช้แอพ โทเค็นแรกเป็นค่าเดียวที่ระบุตัวตนของผู้ใช้ โทเค็นนี้จะต้องเพิ่มลงในพารามิเตอร์อินเทอร์เฟซคำขอ (ไม่ว่าจะเป็นพารามิเตอร์นี้เข้าร่วมในการเข้ารหัสมันขึ้นอยู่กับคุณที่จะตรวจสอบว่ามีส่วนร่วมในการเข้ารหัสหรือไม่ โทเค็นที่สองใช้เพื่อเข้ารหัสค่าของ MD5 โทเค็นนี้ไม่สามารถเพิ่มลงในพารามิเตอร์อินเตอร์เฟสคำขอและเราต้องบันทึกโทเค็นทั้งสองในฐานข้อมูลเนื่องจากหลังจากผู้ใช้ร้องขออินเทอร์เฟซเซิร์ฟเล็ตต้องได้รับโทเค็นผู้ใช้ในพารามิเตอร์แล้วสอบถามโทเค็นที่จำเป็นสำหรับการเข้ารหัส MD5 ในฐานข้อมูล จากนั้น Servlet จะเพิ่มโทเค็นที่เข้ารหัสจากแบบสอบถามไปยังสตริงที่ส่งโดยผู้ใช้และทำการเข้ารหัส MD5 อีกครั้ง หลังจากการเข้ารหัสให้เปรียบเทียบค่าที่เข้ารหัสของ MD5 ที่เข้ารหัสโดยผู้ใช้ ไม่ว่าจะเหมือนกับค่าที่เข้ารหัสของ servlet หากแตกต่างกันอาจมีสองเหตุผล การรวมกันของสตริงการเข้ารหัสที่ด้าน servlet ไม่ถูกต้องและผู้ใช้ได้สกัดกั้นและแก้ไขในช่วงกลางของการส่งข้อมูล ฉันใช้โทเค็นทั้งสองเพื่อสร้างพวกเขาโดยใช้ Java UUID และสิ่งที่ควรสร้างขึ้นสำหรับ UUID เป็นค่าที่ไม่ซ้ำกัน วิธีการสร้างนั้นง่ายมาก ด้านล่างคือรหัส
สตริงคงที่สาธารณะ getUuid () {return uuid.randomuuid (). toString (); -ด้านล่างนี้เป็นวิธีการเข้ารหัส Java MD5 32 บิต
สตริงคงที่สาธารณะ MD5ENCRYPT (String groupparamertstr) โยน unsupportencodingexception {messageGeSest messageGeStest = null; ลอง {messageGeStest = messageGeSt.getInstance ("MD5"); messageGeSt.reset (); messageGeSt.update (groupparamertstr.getBytes ("UTF-8")); } catch (nosuchalgorithmexception e) {system.out.println ("nosuchalgorithmexception จับ!"); System.Exit (-1); } catch (unsupportencodingexception e) {e.printstacktrace (); } byte [] byteArray = messageGeSt.digest (); StringBuffer MD5STRBUFF = new StringBuffer (); สำหรับ (int i = 0; i <bytearray.length; i ++) {ถ้า (integer.tohexstring (0xff & bytearray [i]). ความยาว () == 1) md5strbuff.append ("0") ผนวก อื่น ๆ md5strbuff.append (integer.tohexstring (0xff & bytearray [i])); } ส่งคืน md5strbuff.toString (); - ต่อไปนี้คือการเปรียบเทียบผลลัพธ์การเข้ารหัสกับผลลัพธ์การเข้ารหัสที่ส่งผ่านโดยคำขอของผู้ใช้หลังจากได้รับพารามิเตอร์บน servlet หากหมายความว่าคำขอไม่เป็นไรมิฉะนั้นค่าพารามิเตอร์คำขออาจได้รับการแก้ไข
// พารามิเตอร์สามตัวต่อไปนี้เป็นโทเค็นผู้ใช้ ประการที่สองคือพารามิเตอร์ที่จำเป็นสำหรับการเข้ารหัส หลังจากที่เราสอบถามโทเค็นที่เข้ารหัสผ่านโทเค็นผู้ใช้เราต้องแยกมันลงในสตริง JSON ที่จำเป็นสำหรับการเข้ารหัสเซิร์ฟเล็ต ที่สามคือสตริงผลลัพธ์การเข้ารหัสที่ส่งจากไคลเอนต์ ที่นี่วิธีการส่งคืน 0 เพื่อระบุว่าไม่มีปัญหากับผลการเข้ารหัสของผู้ใช้มิฉะนั้นจะมีข้อผิดพลาดข้อผิดพลาดสาธารณะ int posttokenverify (โทเค็นสตริง, jsonObject requestJsonObject, encryptStStrvalue) {int returnValue = 0; สตริง [] mySqlParameter = สตริงใหม่ [] {โทเค็น}; // ต่อไปนี้คือการสืบค้นโทเค็นการเข้ารหัสของผู้ใช้ผ่านโทเค็น ResultSet returnData = mySqlhepler.executeQuery ("เลือก * จาก infosheet ที่ idtoken =?", mysqlparameter); jsonObject returnObject = null; ลอง {returnObject = resultToJSontool.resultSettoJsonObject (returnData); } catch (sqlexception e1) {// todo catch block catch auto-generated e1.printstacktrace (); } catch (jSonexception e1) {// todo catch block catch ที่สร้างอัตโนมัติ e1.printstacktrace (); } สตริง byencryptStrvalue = ""; ลอง {ถ้า (returnobject.getString ("EncryptToken"). ความยาว ()> 2) {// ระบุว่า idtoken ของผู้ใช้มีอยู่ // returnValuestring; // {"idtoken": "123456", "id": "34", "pwd": "23", "Encrypttoken": "2345678", "บัญชี": "Hang"} /*รหัสต่อไปนี้ โทเค็นไม่สามารถผ่านได้ในระหว่างการร้องขอ ดังนั้นเมื่อเราเข้ารหัส servlet เราจำเป็นต้องสอบถามผู้ใช้ที่เข้ารหัส toke ผ่านโทเค็นของผู้ใช้ หลังจากพบการสืบค้นแล้วเราต้องแยกมันและขอพารามิเตอร์ JSON เพื่อให้สตริงที่เข้ารหัสของ servlet สอดคล้องกับสตริงที่เข้ารหัสโดยผู้ใช้ ต่อไปนี้เป็นวิธีการสืบค้นโทเค็นที่เข้ารหัสและแยกลงในพารามิเตอร์คำขอหลังจากสอบถามโทเค็นที่เข้ารหัส */ byencryptstrvalue = requestjsonobject.toString (). substring (0, requestjsonobject.toString (). ความยาว ()-1); jsonObject EncryptTokenJsonObject = new JSONObject (); ENCRYPTOKENLJSONOBJECT.PUT ("EncryptToken", returnObject.getString ("EncryptToken")); สตริงค่า 1 = encryptkekenjsonobject.toString (). substring (1, encryptokenjsonobject.toString (). length ()); byencryptstrvalue = byencryptstrvalue+","+value1; //} else {returnValue = 1; // idtoken error}} catch (jSonexception e1) {// todo catch block catch auto-generated e1.printstacktrace (); } ลอง {// วิธีการต่อไปนี้คือการใช้สตริงที่ถูกต้องเพื่อเข้ารหัสการเรียกใช้วิธีการเรียกใช้ servlet หลังจากส่งคืนผลลัพธ์ให้เปรียบเทียบผลลัพธ์การเข้ารหัสที่ส่งผ่านโดยสตริงผู้ใช้ javamd5Result = EncryptSafa.md5Encrypt (byencryptstrvalue); if (javamd5result.equals (encryptstrvalue)) {// สตริงการเข้ารหัสถูกต้อง} else {returnValue = 2; // ผลการเข้ารหัสผิด}} catch } return returnValue; -วิธีแรกคือวิธีการห่อหุ้มที่เรียกโดย servlet ด้านล่างเป็นรหัสทั้งหมดที่เรียกโดยหน้า servlet
1. URL ที่ร้องขอ
ที่นี่ฉันกำลังผ่านพจนานุกรมเพื่อแปลงพารามิเตอร์รูปแบบ JSON ซึ่งเป็นรูปแบบคู่คีย์-ค่าและมีเพียงพารามิเตอร์เดียวเท่านั้นที่ใช้สำหรับการร้องขอ idtoken ในพารามิเตอร์คือโทเค็นผู้ใช้และค่าที่ฉันเพิ่มคือการสุ่ม 123456 ในฐานข้อมูล
หากคุณไม่ได้ใช้ UUID แน่นอนว่ามันจะไม่เป็นเช่นนั้นถ้าคุณทำอย่างเป็นทางการ
http: // localhost: 8080/javaservlettest/2.jsp? parameter = {"พารามิเตอร์": "{/" idtoken/":/" 123456/",/" pwd/":/" ภาษาจีน อักขระ/",/" บัญชี/":/" Hang/"}", "MD5STR": "672F4A8C6FB92103C01D4275E46DF790"}
ต่อไปนี้เป็นรหัสที่ประมวลผลโดยหน้า servlet กระบวนการทั้งหมดคือการตรวจสอบว่าคำขอของผู้ใช้ได้รับการแก้ไขในระหว่างการส่งมอบหรือไม่
// ฉันพบปัญหาที่นี่เมื่อวานนี้ เมื่อฉันขอพารามิเตอร์กับภาษาจีน servlet ถูกอ่านไม่ออกหลังจากได้รับ servlet จากนั้นฉันใช้วิธีการต่อไปนี้ String requestjsonstr = สตริงใหม่ (request.getParameter ("พารามิเตอร์"). getBytes ("iso8859-1"), "UTF-8"); // ส่งพารามิเตอร์ jsonObject ObjectParameter = null; // idtoken jsonObject requestparmeter = null; // idtoken string idtoken = ""; // สตริงการเข้ารหัสไคลเอนต์ MD5STR = ""; ลอง {// รับสตริง JSON ทั้งหมด นี่คือพารามิเตอร์ objectParameter ที่เราผ่านจาก url.objectParameter = new JsonObject (requestJSonstr) เท่านั้น // ส่งพารามิเตอร์ค่าคีย์ของ JSON และขอพารามิเตอร์ภายในพารามิเตอร์ ในความเป็นจริงพารามิเตอร์นี้มีพารามิเตอร์ที่ต้องการในธุรกิจเช่น requestParmeter = new JSONObject (ObjectParameter.getString ("พารามิเตอร์")); // idtoken นี่คือโทเค็นผู้ใช้ซึ่งเป็นตัวระบุที่ไม่ซ้ำกันของผู้ใช้ เราจำเป็นต้องสอบถามโทเค็นที่เข้ารหัสที่เกี่ยวข้องในฐานข้อมูลผ่านเพื่อสอบถาม idtoken = requestparmeter.getString ("idtoken"); // สตริงการเข้ารหัสไคลเอนต์ md5str = objectParameter.getString ("MD5STR"); } catch (jSonexception e1) {// todo catch block catch ที่สร้างอัตโนมัติ e1.printstacktrace (); } // สตริงที่สร้างขึ้นหลังจากการเข้ารหัส MD5 // ขั้นตอนต่อไปคือการตรวจสอบว่าโทเค็นนั้นถูกต้อง int tokenverifyResult = EncryptSafa.postTokenverify (idToken, requestParmeter, MD5STR); if (tokenverifyResult == 0) {out.println ("วิธีการเข้ารหัสโทเค็นถูกต้อง"); } else {out.println ("ข้อผิดพลาดวิธีการเข้ารหัสหรือการเข้ารหัสวิธีการเข้ารหัส"); กลับ; -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น