จะสร้างและตรวจสอบความถูกต้องของรหัสลิขสิทธิ์ซอฟต์แวร์ได้อย่างไร


236

ขณะนี้ฉันมีส่วนร่วมในการพัฒนาผลิตภัณฑ์ (พัฒนาใน C #) ที่จะสามารถดาวน์โหลดและติดตั้งได้ฟรี แต่ในเวอร์ชันที่ จำกัด มาก ในการเข้าถึงคุณลักษณะทั้งหมดที่ผู้ใช้ต้องจ่ายค่าธรรมเนียมใบอนุญาตและรับรหัส คีย์นั้นจะถูกป้อนเข้าสู่แอปพลิเคชันเพื่อ "ปลดล็อก" เวอร์ชันเต็ม

เช่นเดียวกับการใช้คีย์ใบอนุญาตแบบปกติฉันสงสัยว่า:

  1. นั่นเป็นวิธีที่มักจะแก้ไขได้อย่างไร
  2. ฉันจะสร้างคีย์ได้อย่างไรและจะตรวจสอบความถูกต้องของแอปพลิเคชันได้อย่างไร
  3. ฉันจะหลีกเลี่ยงการมีรหัสการเผยแพร่บนอินเทอร์เน็ตและใช้โดยผู้อื่นที่ไม่ได้ชำระค่าใบอนุญาตได้อย่างไร (รหัสที่โดยทั่วไปไม่ใช่ "ของพวกเขา")

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

มีอะไรอีกที่ฉันควรคิดถึงในสถานการณ์นี้

คำตอบ:


126

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

สมมติว่าคุณไม่ต้องการสร้างงานพิเศษสำหรับผู้ใช้แต่ละคนจากนั้น:

  • สร้างรหัสลับสำหรับผลิตภัณฑ์ของคุณเอง
  • ใช้ชื่อผู้ใช้
  • เชื่อมต่อชื่อผู้ใช้และรหัสลับและแฮชกับ (ตัวอย่าง) SHA1
  • คลายแฮช SHA1 เป็นสตริงตัวอักษรและตัวเลข นี่คือ "รหัสผลิตภัณฑ์" ของผู้ใช้แต่ละคน
  • ภายในโปรแกรมทำแฮชเดียวกันและเปรียบเทียบกับรหัสผลิตภัณฑ์ ถ้าเท่ากับตกลง

แต่ฉันพูดซ้ำ: นี่จะไม่ป้องกันการละเมิดลิขสิทธิ์


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

แค่คิดว่าฉันควรพูดถึงสิ่งนี้จริงๆ หากคุณวางแผนที่จะรับสิ่งอื่นจากนี้ระวัง


13
หากโปรแกรมมีรหัสลับ (ตามที่ระบุโดยขั้นตอนข้างต้น) การถอดรหัสมันเป็นเรื่องเล็กน้อย
Steven A. Lowe

2
แก้ไขให้ชัดเจนยิ่งขึ้น ไม่สามารถเน้นสิ่งที่เป็นพื้นฐาน ;-)
Steven A. Lowe

23
ใช้วิธีการเข้ารหัสลับแบบอสมมาตร (เช่น RSA) เพื่อสร้างและถอดรหัสรหัสผลิตภัณฑ์เพื่อหลีกเลี่ยงการฝังความลับในรหัส
Amir Moghimi

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

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

97

มีหลายวิธีในการสร้างคีย์ใบอนุญาต แต่มีเพียงไม่กี่วิธีที่ปลอดภัยอย่างแท้จริง และมันก็น่าเสียดายเพราะสำหรับ บริษัท คีย์ใบอนุญาตมีมูลค่าเกือบเท่ากับเงินสดจริง

เป็นการดีที่คุณต้องการให้คีย์ลิขสิทธิ์ของคุณมีคุณสมบัติดังต่อไปนี้:

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

  2. ควรใช้รหัสสิทธิ์การใช้งานบนคอมพิวเตอร์เครื่องเดียวเท่านั้น (หรืออย่างน้อยคุณควรสามารถควบคุมรหัสนี้ได้อย่างแน่นหนา)

  3. รหัสสัญญาอนุญาตควรสั้นและง่ายต่อการพิมพ์หรือเขียนตามคำบอกทางโทรศัพท์ คุณไม่ต้องการให้ลูกค้าทุกคนโทรติดต่อฝ่ายสนับสนุนด้านเทคนิคเพราะพวกเขาไม่เข้าใจว่าคีย์มี "l" หรือ "1" หรือไม่ ฝ่ายสนับสนุนของคุณจะขอบคุณสำหรับสิ่งนี้และคุณจะมีต้นทุนที่ต่ำลงในพื้นที่นี้

ดังนั้นคุณจะแก้ปัญหาความท้าทายเหล่านี้ได้อย่างไร

  1. คำตอบนั้นง่าย แต่ท้าทายทางเทคนิค: ลายเซ็นดิจิทัลโดยใช้การเข้ารหัสคีย์สาธารณะ รหัสสัญญาอนุญาตของคุณควรเป็น "เอกสาร" ที่จริงแล้วมีข้อมูลที่มีประโยชน์ลงนามด้วยรหัสส่วนตัวของ บริษัท ของคุณ ลายเซ็นควรเป็นส่วนหนึ่งของคีย์ใบอนุญาต ผลิตภัณฑ์ควรตรวจสอบคีย์ใบอนุญาตด้วยรหัสสาธารณะที่เกี่ยวข้อง ด้วยวิธีนี้แม้ว่าบางคนสามารถเข้าถึงตรรกะของผลิตภัณฑ์ของคุณได้อย่างเต็มที่พวกเขาไม่สามารถสร้างคีย์ใบอนุญาตได้เนื่องจากพวกเขาไม่มีรหัสส่วนตัว คีย์ใบอนุญาตจะมีลักษณะดังนี้: BASE32 (CONCAT (DATA, PRIVATE_KEY_ENCRYPTED (HASH (DATA)))) ความท้าทายที่ยิ่งใหญ่ที่สุดคืออัลกอริธึมกุญแจสาธารณะแบบคลาสสิกมีขนาดลายเซ็นขนาดใหญ่ RSA512 มีลายเซ็น 1024 บิต คุณไม่ต้องการให้ไลเซนส์คีย์ของคุณมีอักขระนับร้อยตัว หนึ่งในวิธีที่ทรงพลังที่สุดคือการใช้การเข้ารหัสแบบวงรีรูปไข่ (ด้วยการใช้งานอย่างระมัดระวังเพื่อหลีกเลี่ยงสิทธิบัตรที่มีอยู่) ปุ่ม ECC นั้นสั้นกว่าแป้น RSA 6 เท่าเพื่อความแข็งแรงเท่ากัน คุณสามารถลดขนาดลายเซ็นเพิ่มเติมโดยใช้อัลกอริทึมเช่นอัลกอริธึมลายเซ็นดิจิทัลของ Schnorr (สิทธิบัตรหมดอายุในปี 2008 - ดี :))

  2. สิ่งนี้สามารถทำได้โดยการเปิดใช้งานผลิตภัณฑ์ (Windows เป็นตัวอย่างที่ดี) โดยทั่วไปสำหรับลูกค้าที่มีรหัสสิทธิ์การใช้งานที่ถูกต้องคุณต้องสร้าง "ข้อมูลการเปิดใช้งาน" ซึ่งเป็นข้อความที่เซ็นชื่อซึ่งฝังรหัสฮาร์ดแวร์ของคอมพิวเตอร์เป็นข้อมูลที่ลงนาม โดยปกติจะทำผ่านอินเทอร์เน็ต แต่เพียงครั้งเดียวเท่านั้น: ผลิตภัณฑ์จะส่งรหัสสิทธิ์การใช้งานและรหัสฮาร์ดแวร์คอมพิวเตอร์ไปยังเซิร์ฟเวอร์การเปิดใช้งานและเซิร์ฟเวอร์การเปิดใช้งานจะส่งข้อความที่เซ็นชื่อกลับคืน (ซึ่งสามารถทำได้ง่ายและสั้นกว่า โทรศัพท์). จากช่วงเวลาดังกล่าวผลิตภัณฑ์จะไม่ตรวจสอบรหัสสิทธิ์ใช้งานเมื่อเริ่มต้น แต่ข้อมูลการเปิดใช้งานซึ่งต้องการให้คอมพิวเตอร์เหมือนกันเพื่อตรวจสอบความถูกต้อง (มิฉะนั้น DATA จะแตกต่างกันและลายเซ็นดิจิทัลจะไม่ตรวจสอบ)

  3. เพียงแค่กำจัดอักขระที่ซ้ำซ้อนเช่น "1", "l", "0", "o" ออกจากคีย์ของคุณ แยกสตริงคีย์ใบอนุญาตออกเป็นกลุ่มของอักขระ


8
พวกเขาไม่สามารถแก้ไขการเพิ่ม / ลบรหัสของซอฟต์แวร์เพื่อให้การตรวจสอบถูกข้ามไปทั้งหมดได้หรือไม่
Pacerier

คำตอบสำหรับหมายเลข 1 จำเป็นต้องเปิดใช้งาน / ปิดบริการออนไลน์หรือไม่?
Dan W

2
ฉันต้องการจะชี้ให้เห็นว่าคำตอบนี้เหนือกว่าอย่างมากสำหรับสิ่งอื่น ๆ
Erik Aronesty

1
@Pacerier มีหลายสิ่งที่คีย์ใบอนุญาตปกป้อง บริษัท ซอฟต์แวร์จาก การแก้ไข exe ไม่ใช่หนึ่งในนั้น
Erik Aronesty

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

76

คำตอบง่ายๆ - ไม่ว่าคุณจะใช้รูปแบบใดสามารถแตกได้

อย่าลงโทษลูกค้าที่ซื่อสัตย์ด้วยระบบที่มีจุดประสงค์เพื่อป้องกันแฮกเกอร์เนื่องจากแฮกเกอร์จะถอดรหัสโดยไม่คำนึงถึง

รหัสที่แฮชง่าย ๆ ที่เชื่อมโยงกับอีเมลหรือสิ่งที่คล้ายกันน่าจะดีพอ ID ที่ใช้ฮาร์ดแวร์จะกลายเป็นปัญหาเสมอเมื่อผู้คนจำเป็นต้องติดตั้งใหม่หรือปรับปรุงฮาร์ดแวร์

เธรดที่ดีเกี่ยวกับปัญหา: http://discuss.joelonsoftware.com/default.asp?biz.5.82298.34


2
ตกลงคุณไม่ต้องการทำให้ผู้ใช้ที่ซื้อผลิตภัณฑ์ของคุณผิดหวัง! (จ่ายรำลึกเมตร $, แอปเปิ้ล ฯลฯ ... )
เจสัน

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

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

ลิงค์เสีย ....
stigzler

56

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

หลังจากที่คุณพบกุญแจหรือแพตช์บางอันที่ลอยอยู่ในastalavista.box.skคุณจะรู้ว่าคุณประสบความสำเร็จในการทำสิ่งที่เป็นที่นิยมมากพอที่ใครบางคนจะใส่ใจ ดีใจ!


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

1
@thomthom แล้วจะเชื่อมโยงเวอร์ชันสูงสุดกับคีย์ได้อย่างไร แนวคิดเวอร์ชันนั้นมีเหตุผลและเพิ่มความปลอดภัยมากขึ้น
Marvin Thobejane

@MarvinThobejane เพื่อเชื่อมโยงเวอร์ชั่นสูงสุดที่คุณสามารถเซ็นชื่อเวอร์ชั่นสูงสุดที่อนุญาตและมีรหัสซ้ำมันเป็นรุ่นบิต แต่ไม่มี> = ops ที่อนุญาตใน sigs
Erik Aronesty

22

นอกจากสิ่งที่ได้กล่าวไปแล้ว ....

การใช้แอปพลิเคชั่น. NET ใด ๆ นั้นสามารถแตกหักได้ง่ายเนื่องจากปัญหาภาษาระดับกลาง การถอดรหัส. NET แบบง่าย ๆ จะเปิดผลิตภัณฑ์ของคุณให้กับทุกคน พวกเขาสามารถข้ามรหัสใบอนุญาตของคุณได้อย่างง่ายดาย ณ จุดนั้น

คุณไม่สามารถใช้ค่าฮาร์ดแวร์เพื่อสร้างคีย์ได้อีกต่อไป ตอนนี้เครื่องเสมือนอนุญาตให้ใครสักคนสร้างภาพของเครื่องที่ได้รับอนุญาตและเรียกใช้บนแพลตฟอร์มใด ๆ ที่พวกเขาเลือก

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

หากผลิตภัณฑ์ของคุณซับซ้อนปัญหาการสนับสนุนโดยธรรมชาติจะสร้างการป้องกันสำหรับคุณ


9
+1 สำหรับการป้องกันจุดอ่อนในค่าฮาร์ดแวร์เนื่องจากเครื่องเสมือน
รูเบนส์ Mariuzzo

3
นั่นคือสิ่งที่การตั้งชื่อที่แข็งแกร่งสำหรับ. NET และ Authenticode สำหรับการลงนาม PE มีไว้สำหรับ หากมีคน decompiled แก้ไขและสร้างห้องสมุดของคุณใหม่มันจะไม่ถูกลงชื่อและแอปพลิเคชันจะไม่ทำงาน เครื่องเสมือน. NET ไม่อนุญาต
Stephen Tunney

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

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

12

เอ็นจิ้น C # / .NET ที่เราใช้สำหรับการสร้างคีย์ใบอนุญาตได้รับการปรับปรุงเป็นโอเพนซอร์ส:

https://github.com/appsoftware/.NET-Licence-Key-Generator

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

ตามที่ระบุไว้ข้างต้นหากรหัสของคุณสามารถถอดรหัสได้มันค่อนข้างง่ายที่จะหลีกเลี่ยงระบบการออกใบอนุญาตส่วนใหญ่


คุณยินดีที่จะสอนการใช้ผลิตภัณฑ์นี้หรือไม่? ฉันพบว่าวิกิของพวกเขาขาดไปเล็กน้อย
Anthony Ruffino

ขณะนี้โครงการได้เปิดแหล่งที่มาบน GitHub หากมีสิ่งนั้นช่วย (ตอบแก้ไขด้วยลิงก์)
gb2d

10

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

วิธีที่ดีที่สุดในการแก้ไขปัญหานี้คือการตั้งค่าเซิร์ฟเวอร์คีย์ใบอนุญาตที่แต่ละอินสแตนซ์ของแอปพลิเคชันจะโทรติดต่อเพื่อยืนยันรหัสใบอนุญาต

ประโยชน์ของเซิร์ฟเวอร์คีย์ลิขสิทธิ์

ข้อดีของเซิร์ฟเวอร์คีย์ลิขสิทธิ์คือ:

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

การพิจารณา

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

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

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

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

การปกป้องอัลกอริธึมลับ

แอปพลิเคชั่น. NET ส่วนใหญ่สามารถออกแบบวิศวกรรมย้อนกลับได้อย่างง่ายดาย (มีทั้ง diassembler ที่ Microsoft เตรียมไว้ให้เพื่อรับรหัส IL และผลิตภัณฑ์เชิงพาณิชย์บางประเภทสามารถเรียกดูซอร์สโค้ดได้เช่น C #) แน่นอนคุณสามารถทำให้งงงวยรหัส แต่จะไม่ปลอดภัย 100%

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

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

การดำเนินงาน

หากคุณไม่ต้องการที่จะใช้ทุกอย่างด้วยตัวเองฉันจะแนะนำให้ดู บทแนะนำนี้ (ส่วนหนึ่งของCryptolens )


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

ผู้ใช้ไม่สามารถข้ามเซิร์ฟเวอร์สิทธิ์การใช้งานออนไลน์โดยการกำหนดโฮสต์ลูปแบ็คใน Windows ได้หรือไม่ ฉันเคยเห็นหลายแอปพลิเคชั่นถูกละเมิดลิขสิทธิ์เช่นนั้น Resharper และ Matlab เป็นแอปที่ฉันจำได้
Amir Mahdi Nassiri

1
@AmirMahdiNassiri สำหรับคำถามที่ 1: หากพีซีออฟไลน์อย่างถาวรคุณสามารถใช้ดองเกิลนาฬิกาเรียลไทม์ (RTC) เป็นแหล่งที่เชื่อถือได้เป็นเวลา สำหรับคำถามที่ 2: เนื่องจากการตอบสนองถูกเซ็นชื่อด้วยไพรเวตคีย์ของผู้ขาย (และยืนยันด้วยพับลิกคีย์ภายในแอปพลิเคชัน) ฝ่ายตรงข้ามจะต้องลงชื่ออีกครั้งไฟล์โดยไม่ทราบว่าเป็นไพรเวตคีย์ซึ่งในขณะเขียน ไม่สามารถทำได้ด้วยปุ่ม 2048 บิต RSA
Artem


6

ฉันไม่รู้ว่าคุณต้องการได้รับรายละเอียดอย่างไร

แต่ฉันเชื่อว่า. net สามารถเข้าถึงหมายเลขซีเรียลฮาร์ดไดรฟ์

คุณสามารถให้โปรแกรมส่งสิ่งนั้นและสิ่งอื่น ๆ (เช่นชื่อผู้ใช้และที่อยู่ mac ของ nic)

คุณคำนวณรหัสตามนั้นและส่งอีเมลพวกเขากลับมาที่สำคัญ

พวกเขาจะป้องกันพวกเขาจากการสลับเครื่องหลังจากที่พวกเขามีกุญแจ


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

ทำงานเป็นเวลาหลายปีในฐานะวิศวกรซอฟต์แวร์ที่มีผลิตภัณฑ์ที่ใช้หมายเลขซีเรียลจาก hd มันไม่ปลอดภัยอย่างสมบูรณ์สำหรับผู้ที่รู้วิธีการอัปเดต
oden

ฉันหมายถึงใช้หมายเลขนี้กับสิ่งอื่น ๆ (ที่อยู่ mac, FQDN) อาจจะทำให้พวกเขาทั้งหมดอยู่ในแฮช ประเด็นก็คือทำให้มันยากขึ้นเล็กน้อยที่จะหลอกข้อมูลทั้งหมดนี้มากกว่าที่จะเป็นการย้อนกลับของซอฟต์แวร์ในตอนแรกและลบเช็คเพราะมันเป็นตัวเลือกเสมอ
Crash893

4

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

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


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

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

1
ดูเหมือนว่า บริษัท ของคุณจะมึนงงเล็กน้อยโดยกำหนดให้มีการตรวจสอบความถูกต้องเมื่อเริ่มต้นทุกครั้ง
jugg1es

@ เจสันดีพวกเขาควรขึ้นราคาสินค้า
Pacerier

1
@Pacerier: คำตอบที่ผิด
การแข่งขัน Lightness ใน Orbit

4

ฉันใช้งานการเปิดใช้งานอินเทอร์เน็ตครั้งเดียวในซอฟต์แวร์ของ บริษัท ของฉัน (C # .net) ที่ต้องมีรหัสใบอนุญาตที่อ้างถึงใบอนุญาตที่เก็บไว้ในฐานข้อมูลของเซิร์ฟเวอร์ ซอฟต์แวร์ดังกล่าวเข้าสู่เซิร์ฟเวอร์ด้วยคีย์และได้รับข้อมูลสิทธิ์การใช้งานที่เข้ารหัสในเครื่องโดยใช้คีย์ RSA ที่สร้างขึ้นจากตัวแปรบางตัว (การรวมกันของ CPUID และสิ่งอื่น ๆ ที่ไม่เปลี่ยนแปลงบ่อย) บนคอมพิวเตอร์ไคลเอนต์แล้วเก็บไว้ใน รีจิสทรี

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

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


1
แต่ปัญหาหลักของการอนุญาตให้ใช้สิทธิ์บนเว็บคือบริการการให้สิทธิ์การใช้งานกลายเป็นเป้าหมายสำคัญสำหรับการโจมตี DDoS ซึ่งทำให้บริการเป็นอัมพาตหรือทำให้ต้นทุนคลาวด์ขยายตัว
afk5min

4
นั่นคือการบอกว่าไม่มีประโยชน์ที่จะมีเว็บไซต์เพราะมันเสี่ยงต่อการถูกโจมตีแบบ DDoS ...
jugg1es

@ jugg1es ไม่มีที่ไหนในความคิดเห็นของเขาเขาพูดว่า "ไม่มีจุด" เขาชี้ให้เห็นข้อเท็จจริงว่าเป็นช่องโหว่ที่ควรพิจารณา
Dan Bechard

และการตรวจสอบยังสามารถลบออกได้ในไคลเอนต์ ไม่มีการตรวจสอบใบอนุญาตไม่มี webbased ...
azarai

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

4

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

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


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

ไม่คุณไม่จำเป็นต้องใช้บริการเปิดใช้งานออนไลน์ คุณสามารถสร้างไฟล์ลิขสิทธิ์แบบออฟไลน์ได้อย่างสมบูรณ์
panpernicek

ที่สำคัญคือในความเป็นจริงแล้วคุณกำลังวางรหัสสาธารณะเพื่อรหัสเท่านั้นซึ่งไม่สามารถใช้สำหรับการสร้างใบอนุญาต สำหรับการตรวจสอบเท่านั้น
panpernicek

3

เช่นเดียวกับคนอื่น ๆ ที่กล่าวถึงฉันเป็นคู่ต่อสู้ที่ยิ่งใหญ่ของการเป็นศัตรูกับลูกค้าโดยค่าเริ่มต้น - สิ่งที่อุตสาหกรรมการออกใบอนุญาตมีชื่อเสียง ดังนั้นฉันจะขยายโซลูชั่นที่ดีสำหรับปัญหาของคุณที่ให้ลูกค้า UX ที่ดี

ในการเริ่มต้นคุณกล่าวว่าคุณมีซอฟต์แวร์รุ่น "จำกัด " ที่คุณใช้เพื่อลองและแปลงลูกค้าเป็น "อัปเกรด" สำหรับคุณสมบัติเพิ่มเติม ดังนั้นสิ่งที่คุณกำลังมองหาคือใบอนุญาตคุณสมบัติสำหรับผลิตภัณฑ์ของคุณเช่นลูกค้าสามารถซื้อใบอนุญาตสำหรับคุณสมบัติ -Xหรือคุณลักษณะ-Y

ฉันสร้าง Keygenโดยคำนึงถึงสิทธิ์ใช้งานประเภทนี้ Keygen เป็น REST API ที่ให้สิทธิ์ใช้งานซึ่งให้คุณจัดการบัญชีผู้ใช้ใบอนุญาตและติดตามการใช้งาน / การเชื่อมโยงเครื่อง

สิ่งที่ฉันจะทำคือตั้งค่าใบอนุญาต 2 ประเภท ( นโยบายภายใน Keygen) โดยที่หนึ่งเป็นนโยบายพื้นฐานสำหรับรุ่นฟรีที่มี จำกัด และอีกประเภทหนึ่งเป็นนโยบายสำหรับรุ่นที่จำหน่ายได้แล้ว

ฉันไม่แน่ใจว่าสิ่งที่คุณใช้สำหรับการชำระเงิน แต่สมมติว่าคุณกำลังใช้บางอย่างเช่น Stripe (มาตรฐานค่อนข้างดีในปัจจุบัน) ที่ให้บริการwebhooks webhooksKeygen มี webhooks ด้วย (ไม่ว่าคุณจะใช้หรือไม่ก็ตามทั้งหมดนี้ยังคงมีผลบังคับใช้) คุณสามารถรวม Keygen เพื่อพูดคุยกับผู้ให้บริการชำระเงินของคุณโดยใช้ webhooks จากทั้งสองฝ่าย (คิดว่า: customer.created-> สร้างใบอนุญาตฐานสำหรับลูกค้าlicense.created -> เรียกเก็บเงินจากลูกค้าสำหรับใบอนุญาตใหม่)

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

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

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

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

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

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

อย่างไรก็ตามมันยาวมานาน แต่หวังว่ามันจะช่วยใครซักคน!


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

2

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

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


2

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

คุณควรระมัดระวังในการทำให้งงงวย / เข้ารหัสรหัสของคุณหรือสามารถออกแบบวิศวกรรมย้อนกลับได้อย่างง่ายดายโดยใช้ซอฟต์แวร์เช่น De4dot และ. NetReflector รหัส obfuscator ที่ดีฟรีคือ ConfuserEx ซึ่งรวดเร็วและใช้งานง่ายและมีประสิทธิภาพมากกว่าทางเลือกที่มีราคาแพง

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

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

https://quantum-key.net

จะใช้ ConfuserEx ได้อย่างไร?

https://github.com/0xd4d/de4dot

https://www.red-gate.com/dynamic/products/dotnet-development/reflector/download

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