ฉันจะสร้างรหัสผลิตภัณฑ์สำหรับแอปพลิเคชัน C # ของฉันได้อย่างไร
ฉันต้องการสร้างคีย์ผลิตภัณฑ์ (หรือใบอนุญาต) ที่ฉันอัปเดตเป็นประจำทุกปี นอกจากนี้ฉันต้องสร้างหนึ่งสำหรับรุ่นทดลอง
ที่เกี่ยวข้อง:
ฉันจะสร้างรหัสผลิตภัณฑ์สำหรับแอปพลิเคชัน C # ของฉันได้อย่างไร
ฉันต้องการสร้างคีย์ผลิตภัณฑ์ (หรือใบอนุญาต) ที่ฉันอัปเดตเป็นประจำทุกปี นอกจากนี้ฉันต้องสร้างหนึ่งสำหรับรุ่นทดลอง
ที่เกี่ยวข้อง:
คำตอบ:
คุณสามารถทำบางสิ่งเช่นสร้างเรกคอร์ดที่มีข้อมูลที่คุณต้องการตรวจสอบสิทธิ์กับแอปพลิเคชัน ซึ่งอาจรวมถึงสิ่งที่คุณต้องการเช่นคุณสมบัติของโปรแกรมที่จะเปิดใช้งานวันหมดอายุชื่อของผู้ใช้ (หากคุณต้องการผูกไว้กับผู้ใช้) จากนั้นเข้ารหัสโดยใช้อัลกอริทึมการเข้ารหัสลับบางอย่างด้วยคีย์คงที่หรือแฮช จากนั้นคุณก็ตรวจสอบภายในโปรแกรมของคุณ วิธีหนึ่งในการแจกจ่ายไฟล์ลิขสิทธิ์ (บน windows) คือการจัดเตรียมเป็นไฟล์ที่อัปเดตรีจิสทรี (ช่วยให้ผู้ใช้ไม่ต้องพิมพ์)
โปรดระวังความปลอดภัยที่ผิดพลาด - ไม่ช้าก็เร็วจะมีคนแก้ไขโปรแกรมของคุณเพื่อข้ามการตรวจสอบนั้นและแจกจ่ายเวอร์ชันที่ได้รับการแก้ไขแล้ว หรือพวกเขาจะหาคีย์ที่ผ่านการตรวจสอบทั้งหมดและแจกจ่ายสิ่งนั้นหรือย้อนหลังนาฬิกาเป็นต้นไม่สำคัญว่าคุณจะสร้างแผนการของคุณอย่างไรสิ่งที่คุณทำเพื่อสิ่งนี้ในท้ายที่สุดจะเป็นการรักษาความปลอดภัยผ่านความคลุมเครือและพวกเขาจะเสมอ สามารถทำได้ แม้ว่าพวกเขาจะไม่สามารถให้ใครสักคนได้และจะแจกจ่ายเวอร์ชันที่ถูกแฮ็ก เช่นเดียวกันแม้ว่าคุณจะจัดหาดองเกิล - หากมีคนต้องการก็สามารถแก้ไขเช็คได้เช่นกัน การเซ็นรหัสแบบดิจิทัลจะไม่ช่วยอะไรพวกเขาสามารถลบลายเซ็นนั้นหรือลาออกได้
คุณสามารถทำให้เรื่องซับซ้อนขึ้นเล็กน้อยโดยใช้เทคนิคเพื่อป้องกันไม่ให้โปรแกรมทำงานในดีบักเกอร์เป็นต้น แต่ถึงอย่างนั้นก็ไม่สามารถพิสูจน์ได้ ดังนั้นคุณควรทำให้ยากพอที่ผู้ใช้ที่ซื่อสัตย์จะไม่ลืมจ่ายเงิน นอกจากนี้โปรดระวังให้ดีว่าโครงการของคุณจะไม่สร้างความรำคาญให้กับผู้ใช้ที่จ่ายเงิน - ควรมีการคัดลอกสำเนาบางส่วนดีกว่าสำหรับลูกค้าที่ชำระเงินของคุณที่จะไม่สามารถใช้สิ่งที่พวกเขาจ่ายไปได้
อีกทางเลือกหนึ่งคือการตรวจสอบออนไลน์ - เพียงแค่ระบุ ID ที่ไม่ซ้ำกันให้กับผู้ใช้และตรวจสอบทางออนไลน์ว่า ID ควรมีความสามารถใดบ้างและแคชไว้ในช่วงเวลาหนึ่ง ใช้คำเตือนเดียวกันทั้งหมด - ผู้คนสามารถปัดเศษอะไรแบบนี้ได้
พิจารณาค่าใช้จ่ายในการสนับสนุนที่ต้องจัดการกับผู้ใช้ที่ลืมรหัสเป็นต้น
แก้ไข: ฉันแค่อยากจะเพิ่มอย่าใช้เวลามากเกินไปในสิ่งนี้หรือคิดว่ารูปแบบที่ซับซ้อนของคุณจะแตกต่างออกไปและไม่สามารถตรวจสอบได้ จะไม่เป็นเช่นนั้นและไม่สามารถอยู่ได้ตราบเท่าที่ผู้คนควบคุมฮาร์ดแวร์และระบบปฏิบัติการที่โปรแกรมของคุณทำงานอยู่ นักพัฒนาได้พยายามหารูปแบบที่ซับซ้อนมากขึ้นสำหรับสิ่งนี้โดยคิดว่าถ้าพวกเขาพัฒนาระบบของตัวเองขึ้นมาระบบนี้จะเป็นที่รู้จักสำหรับพวกเขาเท่านั้นดังนั้นจึงมีความปลอดภัยมากขึ้น แต่มันเป็นการเขียนโปรแกรมที่เทียบเท่ากับการพยายามสร้างเครื่องเคลื่อนที่ตลอดกาล :-)
คุณไว้วางใจใคร?
ฉันถือว่าพื้นที่นี้สำคัญเกินกว่าที่จะไว้วางใจบุคคลที่สามในการจัดการความปลอดภัยรันไทม์ของแอปพลิเคชันของคุณ เมื่อส่วนประกอบนั้นแตกสำหรับแอปพลิเคชั่นเดียวก็จะแตกสำหรับทุกแอปพลิเคชัน มันเกิดขึ้นกับDiscreetในห้านาทีเมื่อพวกเขาใช้โซลูชันใบอนุญาตของบุคคลที่สามสำหรับ3ds Max เมื่อหลายปีก่อน ... ช่วงเวลาที่ดี!
อย่างจริงจังให้พิจารณาปรับเปลี่ยนของคุณเองเพื่อให้สามารถควบคุมอัลกอริทึมของคุณได้อย่างสมบูรณ์ หากเป็นเช่นนั้นให้พิจารณาใช้ส่วนประกอบในคีย์ของคุณตามบรรทัด:
จากนั้นตรวจสอบนรกออกจากพวกเขาและเพิ่มการเข้ารหัส (ย้อนกลับได้) ที่คุณต้องการเพื่อให้ยากต่อการถอดรหัส
ในการสร้างรหัสสัญญาอนุญาตรุ่นทดลองใช้เพียงแค่ตั้งค่าสำหรับค่าข้างต้นที่แปลเป็น "โหมดทดลองใช้"
และเนื่องจากตอนนี้นี่อาจเป็นรหัสที่สำคัญที่สุดในแอปพลิเคชัน / บริษัท ของคุณนอกเหนือจาก / แทนที่จะทำให้สับสนให้พิจารณาใส่รูทีนถอดรหัสในไฟล์ DLL ดั้งเดิมและเพียงแค่P / เรียกใช้
บริษัท หลายแห่งที่ฉันเคยทำงานได้นำแนวทางทั่วไปมาใช้เพื่อให้ประสบความสำเร็จอย่างมาก หรืออาจจะได้ของไม่คุ้มค่า;)
หากคุณกำลังถามเกี่ยวกับคีย์ที่คุณสามารถพิมพ์ได้เช่นคีย์ผลิตภัณฑ์ของ Windows ก็จะขึ้นอยู่กับการตรวจสอบบางอย่าง หากคุณกำลังพูดถึงคีย์ที่คุณต้องคัดลอกและวางคีย์นั้นจะขึ้นอยู่กับลายเซ็นดิจิทัล (การเข้ารหัสคีย์ส่วนตัว)
ตรรกะของคีย์ผลิตภัณฑ์อย่างง่ายอาจเริ่มต้นด้วยการบอกว่าหมายเลขผลิตภัณฑ์ประกอบด้วยกลุ่ม 5 หลักสี่กลุ่มเช่นabcde-fghij-kljmo-pqrst
และจากนั้นระบุความสัมพันธ์ภายในเช่น f + k + p ควรเท่ากับ a ซึ่งหมายถึงตัวเลขแรกของ 2 กลุ่ม 3 และ 4 ควรรวมเป็นก. ซึ่งหมายความว่าใช้ได้ 8xxxx-2xxxx-4xxxx-2xxxx ดังนั้นคือ 8xxxx-1xxxx-0xxxx-7xxxx แน่นอนว่าจะมีความสัมพันธ์อื่น ๆ เช่นกันรวมถึงความสัมพันธ์ที่ซับซ้อนเช่นหากตัวเลขหลักที่สองของกลุ่มแรกเป็นเลขคี่ตัวเลขสุดท้ายของกลุ่มสุดท้ายก็ควรเป็นเลขคี่เช่นกัน วิธีนี้จะมีเครื่องกำเนิดไฟฟ้าสำหรับคีย์ผลิตภัณฑ์และการตรวจสอบคีย์ผลิตภัณฑ์ก็เพียงแค่ตรวจสอบว่าตรงกับกฎทั้งหมดหรือไม่
การเข้ารหัสเป็นปกติสตริงของข้อมูลเกี่ยวกับใบอนุญาตการเข้ารหัสโดยใช้คีย์ส่วนตัว (== เซ็นชื่อแบบดิจิทัล) และแปลงเป็นBase64 มีการแจกจ่ายคีย์สาธารณะพร้อมกับแอปพลิเคชัน เมื่อสตริง Base64 มาถึงจะมีการยืนยัน (== ถอดรหัส) โดยคีย์สาธารณะและหากพบว่าถูกต้องผลิตภัณฑ์จะเปิดใช้งาน
ไม่ว่าจะเป็นเรื่องเล็กน้อยหรือยากที่จะแตกฉันไม่แน่ใจว่ามันสร้างความแตกต่างได้มากจริงๆ
ความเป็นไปได้ที่แอปของคุณจะแตกนั้นขึ้นอยู่กับประโยชน์ของแอปมากกว่าความแข็งแกร่งของการจัดการคีย์ผลิตภัณฑ์
โดยส่วนตัวฉันคิดว่ามีสองคลาสของผู้ใช้ ผู้ที่จ่ายเงิน. ผู้ที่ไม่ สิ่งที่ทำมักจะทำได้แม้กระทั่งการป้องกันที่ไม่สำคัญที่สุด ผู้ที่ไม่รอให้แตกหรือมองหาที่อื่น ไม่ว่าจะด้วยวิธีใดคุณจะไม่ได้รับเงินอีกต่อไป
ฉันต้องยอมรับว่าฉันทำอะไรบางอย่างที่ค่อนข้างบ้าคลั่ง
เมื่อพวกเขาค้นหาและลบ LicenseCheck สิ่งที่สนุกจะตามมาเมื่อ DLL เริ่มข้อบกพร่องในการแบ่งกลุ่ม
มีตัวเลือกMicrosoft Software Licensing and Protection (SLP) Services ด้วย หลังจากอ่านเรื่องนี้ฉันหวังว่าฉันจะได้ใช้มันจริงๆ
ฉันชอบแนวคิดในการบล็อกบางส่วนของโค้ดตามใบอนุญาต สิ่งที่น่าสนใจและปลอดภัยที่สุดสำหรับ. NET อ่านน่าสนใจแม้ว่าคุณจะไม่ได้ใช้ก็ตาม!
Microsoft® Software Licensing and Protection (SLP) Services คือบริการเปิดใช้งานซอฟต์แวร์ที่ช่วยให้ผู้จำหน่ายซอฟต์แวร์อิสระ (ISV) สามารถใช้เงื่อนไขการอนุญาตที่ยืดหยุ่นสำหรับลูกค้าของตนได้ Microsoft SLP Services ใช้วิธีการป้องกันที่เป็นเอกลักษณ์ซึ่งช่วยปกป้องแอปพลิเคชันและข้อมูลการออกใบอนุญาตของคุณทำให้คุณสามารถออกสู่ตลาดได้เร็วขึ้นในขณะที่เพิ่มการปฏิบัติตามข้อกำหนดของลูกค้า
หมายเหตุ: นี่เป็นวิธีเดียวที่ฉันจะเผยแพร่ผลิตภัณฑ์ที่มีรหัสที่ละเอียดอ่อน (เช่นอัลกอริทึมที่มีค่า)
อีกหนึ่งเครื่องมือราคาไม่แพงสำหรับคีย์ผลิตภัณฑ์และการเปิดใช้งานคือผลิตภัณฑ์ที่เรียกว่า InstallKey ลองดูที่www.lomacons.com
วิธีง่ายๆอย่างหนึ่งคือการใช้Global Unique Identifier (GUID) โดยปกติ GUID จะถูกจัดเก็บเป็นค่า 128 บิตและโดยทั่วไปจะแสดงเป็นเลขฐานสิบหก 32 หลักโดยมีกลุ่มคั่นด้วยเครื่องหมายขีดกลางเช่น{21EC2020-3AEA-4069-A2DD-08002B30309D}
.
ใช้รหัสต่อไปนี้ใน C # System.Guid.NewGuid()
โดย
getKey = System.Guid.NewGuid().ToString().Substring(0, 8).ToUpper(); //Will generate a random 8 digit hexadecimal string.
_key = Convert.ToString(Regex.Replace(getKey, ".{4}", "$0/")); // And use this to separate every four digits with a "/".
ฉันหวังว่ามันจะช่วยได้
เคล็ดลับคือการมีอัลกอริทึมที่คุณเท่านั้นที่รู้ (ซึ่งสามารถถอดรหัสได้ที่ปลายอีกด้านหนึ่ง)
มีสิ่งง่ายๆเช่น "เลือกจำนวนเฉพาะและเพิ่มจำนวนวิเศษ"
ตัวเลือกที่ซับซ้อนมากขึ้นเช่นการใช้การเข้ารหัสแบบไม่สมมาตรของชุดข้อมูลไบนารี (ซึ่งอาจรวมถึงตัวระบุที่ไม่ซ้ำกันหมายเลขเวอร์ชัน ฯลฯ ) และแจกจ่ายข้อมูลที่เข้ารหัสเป็นคีย์
อาจคุ้มค่าที่จะอ่านคำตอบสำหรับคำถามนี้เช่นกัน
มีเครื่องมือและ API บางอย่างสำหรับมัน อย่างไรก็ตามฉันไม่คิดว่าคุณจะหาได้ฟรี;)
ตัวอย่างเช่นชุด OLicense: http://www.olicense.de/index.php?lang=en
ฉันจะพูดถึงคำตอบที่ยอดเยี่ยมของ @ frankodwyer และเจาะลึกลงไปอีกเล็กน้อยเกี่ยวกับการออกใบอนุญาตออนไลน์ ฉันเป็นผู้ก่อตั้งKeygenซึ่งเป็น REST API ที่ออกใบอนุญาตที่สร้างขึ้นสำหรับนักพัฒนา
เนื่องจากคุณกล่าวว่าต้องการใบอนุญาต 2 "ประเภท" สำหรับแอปพลิเคชันของคุณนั่นคือ "เวอร์ชันเต็ม" และ "เวอร์ชันทดลองใช้" เราจึงสามารถลดความซับซ้อนและใช้รูปแบบสิทธิ์การใช้งานคุณลักษณะที่คุณให้สิทธิ์ใช้งานคุณลักษณะเฉพาะของแอปพลิเคชันของคุณ (ในกรณีนี้ มีชุดคุณลักษณะ "เต็ม" และชุดคุณลักษณะ "ทดลองใช้")
เพื่อเริ่มต้นเราสามารถสร้าง 2 ประเภทใบอนุญาต (เรียกว่านโยบายใน Keygen) และเมื่อใดก็ตามที่ผู้ใช้ลงทะเบียนบัญชีคุณสามารถสร้าง "การทดลอง" ใบอนุญาตสำหรับพวกเขาที่จะเริ่มต้น (ที่ "การทดลอง" ใบอนุญาตการดำเนินการของเรา "การทดลอง" นโยบายคุณลักษณะ) ซึ่งคุณสามารถใช้เพื่อทำการตรวจสอบต่างๆภายในแอปเช่นผู้ใช้สามารถใช้ทดลองคุณสมบัติ-Aและทดลองคุณสมบัติ-B
และการสร้างว่าเมื่อใดก็ตามที่ผู้ใช้ซื้อแอปของคุณ (ไม่ว่าคุณกำลังใช้ PayPal, ลาย ฯลฯ ) คุณสามารถสร้างใบอนุญาตการดำเนินการ "เต็ม" นโยบายคุณลักษณะและเชื่อมโยงกับผู้ใช้บัญชี ตอนนี้ภายในแอปของคุณคุณสามารถตรวจสอบว่าผู้ใช้มีใบอนุญาต "เต็ม" ที่สามารถทำPro-Feature-XและPro-Feature-Y ได้หรือไม่ (โดยทำสิ่งที่ต้องการuser.HasLicenseFor(FEATURE_POLICY_ID)
)
ฉันได้กล่าวถึงการอนุญาตให้ผู้ใช้ของคุณสร้างบัญชีผู้ใช้นั่นหมายความว่าอย่างไร ฉันได้อธิบายรายละเอียดนี้ในคำตอบอื่น ๆ อีกสองสามคำแต่สรุปสั้น ๆ ว่าทำไมฉันถึงคิดว่านี่เป็นวิธีที่ดีกว่าในการตรวจสอบและระบุตัวผู้ใช้ของคุณ:
แน่นอนว่าหากคุณไม่ต้องการจัดการบัญชีผู้ใช้และคุณต้องการให้ผู้ใช้ของคุณป้อนรหัสใบอนุญาตก็ทำได้ดี (และ Keygen ก็รองรับการทำเช่นนั้นเช่นกัน ) ฉันแค่เสนอวิธีอื่นในการจัดการด้านการออกใบอนุญาตและหวังว่าจะให้ UX ที่ดีสำหรับลูกค้าของคุณ
ในที่สุดเนื่องจากคุณได้กล่าวว่าคุณต้องการอัปเดตใบอนุญาตเหล่านี้เป็นประจำทุกปีคุณสามารถกำหนดระยะเวลาในนโยบายของคุณเพื่อให้ใบอนุญาต "เต็ม" จะหมดอายุหลังจาก 1 ปีและใบอนุญาต "ทดลองใช้" สุดท้ายจะบอกว่า 2 สัปดาห์โดยต้องให้ผู้ใช้ของคุณซื้อใหม่ ใบอนุญาตหลังจากหมดอายุ
ฉันสามารถขุดได้มากขึ้นเชื่อมโยงเครื่องจักรกับผู้ใช้และสิ่งต่างๆเช่นนั้น แต่ฉันคิดว่าฉันจะพยายามรักษาคำตอบนี้ให้สั้นและมุ่งเน้นไปที่คุณสมบัติการให้สิทธิ์การใช้งานกับผู้ใช้ของคุณ
โปรดตรวจสอบคำตอบนี้: https://stackoverflow.com/a/38598174/1275924
แนวคิดคือการใช้Cryptolensเป็นเซิร์ฟเวอร์ใบอนุญาต นี่คือตัวอย่างทีละขั้นตอน (ใน C # และ VB.NET) ฉันได้แนบข้อมูลโค้ดสำหรับการยืนยันคีย์ด้านล่างด้วย (ใน C #):
var licenseKey = "GEBNC-WZZJD-VJIHG-GCMVD";
var RSAPubKey = "{enter the RSA Public key here}";
var auth = "{access token with permission to access the activate method}";
var result = Key.Activate(token: auth, parameters: new ActivateModel()
{
Key = licenseKey,
ProductId = 3349,
Sign = true,
MachineCode = Helpers.GetMachineCode()
});
if (result == null || result.Result == ResultType.Error ||
!result.LicenseKey.HasValidSignature(RSAPubKey).IsValid())
{
// an error occurred or the key is invalid or it cannot be activated
// (eg. the limit of activated devices was achieved)
Console.WriteLine("The license does not work.");
}
else
{
// everything went fine if we are here!
Console.WriteLine("The license is valid!");
}
Console.ReadLine();