วิธีที่ดีที่สุดในการซ่อนรหัส API ในซอร์สโค้ด


12

ฉันต้องการแนวคิดในการปกป้องคีย์ API ส่วนตัวในแอปพลิเคชันโดยเฉพาะในแอปพลิเคชัน ac # .NET

ประการแรกฉันเข้าใจว่าในทางทฤษฎีมันเป็นไปไม่ได้ที่จะซ่อนอะไรในซอร์สโค้ดดังนั้นฉันจึงคิดความคิดอื่น แต่ฉันไม่แน่ใจว่ามันเป็นไปได้จริง อย่างไรก็ตามมีความเป็นไปได้ไหมที่จะสื่อสารกับเว็บเซิร์ฟเวอร์เพื่อตรวจสอบรหัสส่วนตัวจากนั้นพูดคุยกลับไปที่แอปพลิเคชันเพื่อยืนยันว่าเป็นการจับมือที่ถูกกฎหมายหรือไม่

ฉันมีสองปุ่มที่จะทำงานกับ: กุญแจสาธารณะ (ตามชื่อที่แนะนำมันไม่จำเป็นต้องได้รับการดูแลเช่นเดียวกับความเป็นส่วนตัว) และกุญแจส่วนตัวที่ต้องได้รับการรักษาความปลอดภัยจากผู้อื่น

ความคิดเห็นใด ๆ เกี่ยวกับวิธีที่ฉันสามารถทำได้จะได้รับการชื่นชมอย่างมาก


4
คุณพยายามป้องกันคนที่เข้าถึงแอปพลิเคชั่นไบนารีที่ปรับใช้ไม่ให้อ่านคีย์ (ตามที่ชื่อของคุณบอกเป็นนัย) หรือป้องกันไม่ให้พวกเขาแก้ไขมัน เป้าหมายสุดท้ายคืออะไร
gregmac

3
มันอาจเป็นประโยชน์ในการร่างแนวคิดของคีย์ APIสำหรับผู้อ่านที่ไม่คุ้นเคย รหัส API เป็นความลับที่มอบให้แก่ผู้พัฒนาซอฟต์แวร์บางตัวที่โต้ตอบกับบริการ (โดยทั่วไปคือบริการบนเว็บ) มันถูกใช้เพื่อระบุแหล่งที่มาของการจราจรยกข้อ จำกัด กับการเข้าถึงแบบไม่ระบุชื่อและเพื่อเรียกเก็บเงินเจ้าของกุญแจสำหรับการใช้บริการ คุณคาดว่าจะซ่อนไว้ในระดับปานกลางและจะดีกว่าถ้ามันถูกบุกรุก เนื่องจากต้องมีการสื่อสารอย่างเต็มที่กับบริการคุณจึงสูญเสียเสมอ
Lars Viklund

@gregmac ใช่ฉันพยายามป้องกันไม่ให้ผู้ใช้บุคคลที่สามของแอปพลิเคชันอ่านรหัส
Spencer

อย่าวางไว้ที่นั่น
CodeART

คำตอบ:


14

เพื่อสรุป:

  • คุณมีรหัส API ที่ออกให้แก่คุณโดยผู้ขายเพื่อให้คุณสามารถใช้ API ของพวกเขาและคุณมีภาระผูกพันในการป้องกันไม่ให้บุคคลอื่นทราบว่าจะต้องใช้รหัสนี้ในคีย์
  • คุณกำลังเรียกใช้ API ของผู้ขายรายนั้น (ซึ่งต้องใช้คีย์ API) ในรหัสแอปพลิเคชันของคุณ
  • คุณกำลังปรับใช้แอปพลิเคชันกับระบบที่ลูกค้ามีการเข้าถึงไบนารีและดังนั้นจึงอาจถอดรหัส / ยกเลิกการดักฟังรหัสหรือดักจับทราฟฟิก

วิธีที่ดีที่สุดในการป้องกันการประนีประนอมของคีย์นี้คือการควบคุมมัน ซึ่งหมายความว่าไม่ควรนำไปใช้งานบนเซิร์ฟเวอร์ที่ใครก็ตามที่อยู่นอกเหนือจากคุณสามารถอ่านไบนารีและไม่เคยผ่านลิงก์การสื่อสารที่คุณไม่ได้ควบคุม

ในที่สุดหากไบนารีอยู่นอกเหนือการควบคุมของคุณทุกอย่างในนั้นจะอยู่นอกเหนือการควบคุมของคุณ หากใครบางคนสามารถสกัดกั้นทราฟฟิกพวกเขาสามารถจับคีย์ API ( อาจถึงแม้ว่าคุณกำลังใช้ SSL )

ฉันเห็นสองวิธีหลักในการทำให้สำเร็จซึ่งทั้งสองอย่างนี้ไม่รวมคีย์ API ส่วนตัวของคุณในแอปพลิเคชันที่ปรับใช้ของคุณ:

รับคีย์ API ที่ไม่ซ้ำกันสำหรับการปรับใช้แต่ละครั้ง

สิ่งนี้จะต้องมีความสัมพันธ์เพิ่มเติมกับผู้จำหน่ายซึ่งคุณสามารถรับรหัสหรือให้ลูกค้ารับรหัสได้

อันที่จริงแล้วเป็นเรื่องธรรมดามากเช่นผลิตภัณฑ์ที่ใช้ Google Maps API ผู้สร้างซอฟต์แวร์มีรหัสของตนเองที่พวกเขาใช้ในขณะที่พัฒนา / เรียกใช้สำเนาของพวกเขา แต่พวกเขาไม่ได้รวมไว้ในซอฟต์แวร์และต้องการให้คุณในฐานะผู้ใช้ติดตั้งซอฟต์แวร์ดังกล่าวเพื่อไปที่ Google และรับ API ของคุณเอง สำคัญ. ซอฟต์แวร์มีเพียงตัวเลือกการกำหนดค่าเพื่อตั้งค่าคีย์ Google Maps API ให้ใช้

ในความเป็นจริงผู้ขายจำนวนมากที่ออกคีย์ API ต้องให้คุณทำสิ่งนี้ตามสัญญาดังนั้นคุณอาจปิดเส้นทางที่ไม่ถูกต้องอยู่ดีและนี่อาจเป็นทางออกเดียวที่คุณได้รับอนุญาตให้ใช้ตามข้อกำหนดในการให้บริการของผู้ขายและ / หรือสัญญาทางกฎหมายใด ๆ ที่คุณอาจมีกับพวกเขา

ใช้พร็อกซี่

ตั้งค่าพร็อกซี API ซึ่งแอปพลิเคชันของคุณเรียก API ของคุณ (บนเซิร์ฟเวอร์ของคุณ) และในทางกลับกัน API ของคุณจะเรียก API ของผู้ขายโดยใช้รหัส

คุณอาจต้องการการป้องกันเพิ่มเติมเกี่ยวกับ API ของคุณเช่นบางสิ่งเพื่อให้แน่ใจว่ามีเพียงแอปพลิเคชันของคุณเท่านั้นที่ใช้ สิ่งนี้สามารถทำได้โดย:

  • ทำให้ฟังก์ชั่นไม่มีอะไรพิเศษเฉพาะ แต่แอพของคุณสามารถใช้งานได้
  • รายการ IP ที่ปลอดภัย
  • กลไกการออกใบอนุญาต / การอนุญาตที่คุณมีอยู่แล้วสำหรับเซิร์ฟเวอร์ของคุณ
  • ระบบกุญแจ API ของคุณเองที่คุณสามารถออกกุญแจให้กับลูกค้าของคุณ

สิ่งที่คุณควรจำไว้คือคุณอาจไม่ได้รับอนุญาตให้ทำเช่นนี้ ผู้ขายของคุณอาจมีข้อกำหนดในการให้บริการหรือสัญญาทางกฎหมายที่ป้องกันไม่ให้คุณสร้าง "บริการรวม" หรือพร็อกซีดังนั้นคุณต้องตรวจสอบกับสิ่งนั้น


การจัดการพฤติกรรมที่ไม่เหมาะสม

แม้ว่าคีย์ของคุณจะไม่ได้รับอันตราย แต่อย่างใดหากลูกค้าคนหนึ่งของคุณกำลังทำอะไรบางอย่างที่ทำให้ผู้ขายบล็อคคีย์ของคุณทันใดนั้นลูกค้าทั้งหมดของคุณจะถูกปิดการใช้งานและการแก้ไขเพียงอย่างเดียวของคุณก็คือ

ในทำนองเดียวกันถ้าคุณต้องการบล็อกลูกค้าของคุณ (เช่นพวกเขาหยุดจ่ายเงินละเมิดลิขสิทธิ์ซอฟต์แวร์ ฯลฯ ) คุณจะไม่สามารถทำได้โดยไม่ต้องออกการอัปเดตให้คนอื่นแล้วปิดใช้งานคีย์

โลจิสติกส์ของสิ่งนี้สำหรับทุกสิ่งที่นอกเหนือจากกำมือของลูกค้าจะกลายเป็นไม่สามารถป้องกันได้อย่างรวดเร็ว

ไม่ว่าคุณจะทำหน้าที่เป็นพร็อกซีหรือมีคีย์เฉพาะสำหรับการติดตั้งแต่ละครั้งคุณสามารถจัดการกับสถานการณ์เหล่านี้ได้อย่างง่ายดาย (และไม่มีผลกระทบต่อผู้อื่นเล็กน้อย)


การพยายามปกป้องคีย์ขณะที่มันฝังอยู่ในซอฟต์แวร์ของคุณนั้นเป็นความพยายามที่ไร้ประโยชน์ ไม่ว่าคุณจะทำอะไรผู้โจมตีที่เข้าถึงไบนารีแหล่งที่มาและ / หรือช่องทางการสื่อสารและมีความมุ่งมั่นมากพอที่จะได้รับกุญแจพวกเขาจะสามารถทำได้

ดังนั้นอย่าฝังไว้ "การย้ายที่ชนะอย่างเดียวไม่สามารถทำได้"


2
+1 สำหรับ "รับคีย์ API ที่ไม่ซ้ำกันสำหรับการปรับใช้แต่ละครั้ง" อาจใช้ร่วมกับพร็อกซีทำให้คุณมีความสามารถ [จำกัด ] เพื่อปิดการใช้งานคีย์ / ไคลเอนต์
svidgen

@svidgen เป็นประเด็นที่ดีมากฉันได้เพิ่มหัวข้อที่พูดถึง ขอบคุณ
gregmac

1
+1 คีย์สากลเกือบจะกัดคุณอยู่เสมอใน ***
ไวแอตต์บาร์เน็ตต์

การตอบสนองในเชิงลึกมาก น่าเสียดายที่ฉันได้รับมอบหมายคีย์ส่วนตัว API เพียงคีย์เดียวดังนั้นการขอให้ผู้ใช้ดึงกุญแจไม่สามารถทำได้เนื่องจากฉันอยู่ภายใต้ NDA ด้วยโปรโตคอลเครือข่ายจึงเป็นเหตุผลสำหรับคีย์ส่วนตัว พร็อกซีอาจเป็นคำถามเช่นกัน ฉันอาจต้องหันไปใช้วิธีการเปลี่ยนเป็นรูปแบบที่ไม่ใช่มนุษย์อ่านและวางไว้ในแหล่งที่มา - ไม่ใช่ตัวเลือกที่ดี แต่ไม่มีตัวเลือกมากมายเหลืออยู่
Spencer

@Spencer "พร็อกซีอาจเป็นคำถาม" ทำไม? ดูเหมือนว่าไร้สาระและการกระจายคีย์อาจเป็นการละเมิด NDA ของคุณ
Andy

5

หากคุณมีรหัสในรหัสวัตถุมันเป็นแบบสาธารณะโดยการกำหนด มีแฮ็กอยู่รอบ obfuscators ที่ถอดรหัสรหัสวัตถุได้อย่างรวดเร็ว รหัสส่วนตัวจะอยู่นอกรหัสวัตถุและในไฟล์อื่น ส่วนที่ยากคือการให้กุญแจส่วนตัวนี้แก่ผู้ใช้ เมื่อได้รับแล้วคุณสามารถใช้ลายเซ็นของไพรเวตคีย์ติดกับส่วนท้ายของไฟล์และพับลิกคีย์ภายในแอ็พพลิเคชันเพื่อตรวจสอบความถูกต้องของไพรเวตคีย์ เว็บเซิร์ฟเวอร์สามารถทำการตรวจสอบนี้หากคุณมีช่องทางการสื่อสารที่ปลอดภัย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.