TL; DR: อย่าใช้อาร์กิวเมนต์บูลีน
ดูด้านล่างทำไมพวกเขาถึงไม่ดีและวิธีการแทนที่พวกเขา (ในหน้าตัวหนา)
อาร์กิวเมนต์บูลีนอ่านได้ยากมากและยากต่อการบำรุงรักษา ปัญหาหลักคือวัตถุประสงค์โดยทั่วไปจะชัดเจนเมื่อคุณอ่านวิธีการที่มีการตั้งชื่ออาร์กิวเมนต์ อย่างไรก็ตามโดยทั่วไปการตั้งชื่อพารามิเตอร์ไม่จำเป็นต้องใช้ในภาษาส่วนใหญ่ ดังนั้นคุณจะมีรูปแบบการต่อต้านเหมือนRSACryptoServiceProvider#encrypt(Byte[], Boolean)
ที่พารามิเตอร์บูลีนเป็นตัวกำหนดชนิดของการเข้ารหัสที่จะใช้ในฟังก์ชั่น
ดังนั้นคุณจะได้รับสายเช่น:
rsaProvider.encrypt(data, true);
ที่ผู้อ่านจะต้องค้นหาลายเซ็นของวิธีการเพียงเพื่อกำหนดสิ่งที่นรกtrue
อาจหมายถึง การส่งจำนวนเต็มที่แน่นอนว่าไม่ดี:
rsaProvider.encrypt(data, 1);
จะบอกคุณมาก - หรือมากกว่า: เพียงเล็กน้อย แม้ว่าคุณจะกำหนดค่าคงที่ที่จะใช้สำหรับจำนวนเต็มผู้ใช้ฟังก์ชันอาจเพิกเฉยและใช้ค่าตัวอักษรต่อไป
วิธีที่ดีที่สุดในการแก้ปัญหานี้คือการใช้การแจงนับ หากคุณต้องผ่าน Enum RSAPadding
ด้วยค่าสองค่า: OAEP
หรือPKCS1_V1_5
จากนั้นคุณจะสามารถอ่านรหัสได้ทันที:
rsaProvider.encrypt(data, RSAPadding.OAEP);
บูลีนมีค่าได้สองค่าเท่านั้น ซึ่งหมายความว่าหากคุณมีตัวเลือกที่สามคุณจะต้องปรับโครงสร้างลายเซ็นของคุณใหม่ โดยทั่วไปแล้วสิ่งนี้ไม่สามารถทำได้อย่างง่ายดายหากปัญหาความเข้ากันได้แบบย้อนหลังเป็นสิ่งที่ต้องทำดังนั้นคุณต้องขยายคลาสสาธารณะด้วยวิธีสาธารณะอื่น นี่คือสิ่งที่ Microsoft ทำในที่สุดเมื่อพวกเขาแนะนำRSACryptoServiceProvider#encrypt(Byte[], RSAEncryptionPadding)
ที่พวกเขาใช้การแจงนับ (หรืออย่างน้อยคลาสที่เลียนแบบการแจงนับ) แทนที่จะเป็นบูลีน
มันอาจจะง่ายกว่าในการใช้วัตถุหรือส่วนต่อประสานแบบเต็มเป็นพารามิเตอร์ในกรณีที่พารามิเตอร์นั้นจำเป็นต้องมีการกำหนดพารามิเตอร์ ในตัวอย่างข้างต้น OAEP การขยายตัวเองสามารถกำหนดพารามิเตอร์ด้วยค่าแฮชที่จะใช้ภายใน โปรดทราบว่าขณะนี้มีแฮชอัลกอริธึม 6 SHA-2 และอัลกอริทึมแฮช 4 SHA-3 ดังนั้นจำนวนค่าการแจงนับอาจระเบิดได้หากคุณใช้การแจงนับครั้งเดียวแทนที่จะเป็นพารามิเตอร์ (นี่อาจเป็นสิ่งต่อไปที่ Microsoft จะหา )
พารามิเตอร์บูลีนอาจระบุว่าวิธีหรือคลาสไม่ได้รับการออกแบบมาอย่างดี เช่นเดียวกับตัวอย่างด้านบน: ไลบรารีการเข้ารหัสใด ๆ ที่นอกเหนือจาก. NET ไม่ได้ใช้แฟล็ก padding ในลายเซ็นเมธอดเลย
ผู้เชี่ยวชาญด้านซอฟต์แวร์เกือบทั้งหมดที่ฉันชอบเตือนต่ออาร์กิวเมนต์บูลีน ตัวอย่างเช่น Joshua Bloch เตือนพวกเขาในหนังสือ "Java ที่มีประสิทธิภาพ" โดยทั่วไปแล้วไม่ควรใช้ คุณสามารถโต้แย้งว่าพวกเขาสามารถนำมาใช้หากกรณีที่มีหนึ่งพารามิเตอร์ที่ง่ายต่อการเข้าใจ แต่ถึงอย่างนั้น: Bit.set(boolean)
น่าจะดำเนินการได้ดีกว่าการใช้สองวิธี : และBit.set()
Bit.unset()
หากคุณไม่สามารถปรับโครงสร้างโค้ดได้โดยตรงคุณสามารถกำหนดค่าคงที่ให้อย่างน้อยทำให้อ่านง่ายขึ้น:
const boolean ENCRYPT = true;
const boolean DECRYPT = false;
...
cipher.init(key, ENCRYPT);
สามารถอ่านได้มากกว่า:
cipher.init(key, true);
แม้ว่าคุณจะต้องการ:
cipher.initForEncryption(key);
cipher.initForDecryption(key);
แทน.