2010-04-15 43 views
23

Có rất nhiều câu hỏi liên quan đến khóa cấp phép được hỏi trên Stack Overflow. Nhưng họ không trả lời câu hỏi này.Tìm kiếm thuật toán khóa cấp phép

Có ai có thể cung cấp thuật toán khóa cấp phép đơn giản độc lập với công nghệ và không yêu cầu bằng tốt nghiệp toán học để hiểu không?

Thuật toán khóa cấp phép tương tự với mã hóa khóa công khai. Tôi chỉ cần một cái gì đó đơn giản có thể được thực hiện trong bất kỳ nền tảng .NET/Java và sử dụng dữ liệu đơn giản như ký tự.

Câu trả lời được viết dưới dạng mã giả là hoàn hảo.

Vì vậy, nếu một người trình bày một chuỗi, chuỗi bổ sung có thể được tạo là mã ủy quyền. Dưới đây là một kịch bản phổ biến mà nó sẽ được sử dụng cho.

  1. Phần mềm tải xuống khách hàng tạo khóa duy nhất khi khởi động/cài đặt ban đầu.
  2. Phần mềm chạy trong thời gian dùng thử.
  3. Khi kết thúc thời gian dùng thử, khóa ủy quyền là bắt buộc.
  4. khách hàng đi vào thiết kế trang web, vào mã của họ và nhận được mã uỷ quyền để cho phép các phần mềm, sau khi thanh toán :)

Đừng ngại để mô tả câu trả lời của bạn như thể bạn đang nói chuyện với một 5yr cũ như tôi không phải là một nhà toán học.

+2

Tôi nghĩ điều quan trọng là "và không yêu cầu bằng tốt nghiệp toán học để hiểu * và không dễ để phá vỡ nó là vô nghĩa *", trong trường hợp đó câu trả lời thường là không. –

+1

Đừng quên để thêm rằng nó cần phải được miễn phí, và giao cho bạn trên một đĩa bạc. –

+0

@GregS. Đó là spririt! LOL ... Tôi đã thực hiện một số googling, và đã không thành công trong việc tìm kiếm một thuật toán hợp lý. Hy vọng ai đó có thể tham khảo một liên kết đáng giá – giulio

Trả lời

34

Không có thuật toán cấp phép đáng tin cậy nào. Có thật không. Thậm chí không một. Đối với phần mềm độc quyền phổ biến nhất, đắt nhất bạn có thể mua, bạn cũng có thể tìm thấy "máy phát điện chính" và các phiên bản bị tấn công không yêu cầu cấp phép.

Thay vì lo lắng về việc làm cho nó "không thể phá vỡ", chỉ cần làm điều gì đó đơn giản. Cơ chế phổ biến là, khi mua hàng, hãy yêu cầu tên người dùng và sau đó cung cấp cho anh ta khóa cấp phép có nguồn gốc từ băm mật mã (ví dụ: tổng MD5) của tên người dùng hoặc một số biến thể trên đó. Sau đó, trong phần mềm bạn yêu cầu tên của họ một lần nữa, cộng với chìa khóa đăng ký (mà MD5 có nguồn gốc điều); bạn kiểm tra xem chúng có khớp với nhau hay không, nó sẽ kích hoạt phần mềm.

Điều này có thể bị tấn công không? Chắc chắn rồi. Khi ai đó tìm ra cách bạn tạo khóa cấp phép, họ có thể tạo khóa cấp phép của riêng họ. Nhưng nếu bạn giữ một cơ sở dữ liệu của các khóa cấp phép "chính thức" mà bạn đã tạo cho đến nay, ít nhất bạn sẽ có thể xác định những kẻ gian lận sau này (có thể khi họ cố gắng tải xuống nội dung "cao cấp").

Nhưng đừng lo lắng nhiều về việc ngăn chặn tin tặc xâm phạm mã của bạn. Nó sẽ xảy ra, nhưng chúng là một phần nhỏ của thị trường mà nó sẽ không ảnh hưởng đáng kể đến doanh số bán hàng của bạn.

+1

Tên và ngày mua hàng là một sự kết hợp chung.Khi họ gia hạn, bạn phải tạo một khóa mới. Bạn ghi lại tên plaintext trong một tệp và thời gian sửa đổi tệp cũng là một phần của chuỗi băm được sử dụng để tạo khóa cấp phép. –

+0

Thuật toán cũng cần phải có cách hết hạn. Ý tưởng hay, nhưng không bắt buộc phải kích hoạt trong những gì tôi đang làm. – giulio

+0

@giulio: Bạn không phải triển khai hết hạn. Nhưng bạn phải cung cấp đủ muối mà chìa khóa không thể đoán được. Ngày tạo là loại muối tiêu chuẩn. –

1

Trong các vấn đề về an ninh, không tái sử dụng một thuật toán nổi tiếng và được thử nghiệm và cố gắng để tạo ra riêng (thiếu kiến ​​thức toán học) của bạn là tự tử

Tiết lộ: tôi hoàn toàn thiếu mức độ toán học để tạo ra thuật toán như vậy và thẳng thắn, tôi không đích thân biết bất kỳ ai có nó

+0

Tôi đã tìm kiếm một thuật toán giả tôi có thể thích ứng với một ngôn ngữ lập trình chuẩn và sử dụng các khái niệm về chuỗi. Tôi thấy nó bị "tự sát" nếu bạn bắt đầu tryin để thực hiện các bản dịch cấp byte. – giulio

+5

Tôi * có * có bằng về toán học với một nghiên cứu chính trong Lý thuyết số (nơi mà rất nhiều loại thuật toán này có nguồn gốc của chúng trong đó) và tôi hoàn toàn đồng ý. –

+0

"không tái sử dụng một thuật toán nổi tiếng và được thử nghiệm và cố gắng để tạo ra của riêng bạn" ... không phải là lý do tại sao anh ta hỏi ở đây? Bạn biết đấy, để tránh làm điều bạn đang bảo anh ta đừng làm. – pc1oad1etter

3

Nói chung, những gì bạn đang cố gắng làm là vô nghĩa. Tuy nhiên nhiều thời gian nó sẽ đưa bạn để viết một xác nhận/mã hóa/khóa hệ thống, ước tính khoảng một nửa mà cho một ai đó để phá vỡ nó. Ngay cả khi bạn mã hóa tệp thực thi cuối cùng.Tuy nhiên, như là một biện pháp trì hoãn hoặc một cách để giảm cơ hội của những người nhận được hỗ trợ phí bảo hiểm cho các bản sao bị đánh cắp, nó sẽ giúp đỡ. Ngoài ra để theo dõi đơn giản của người mua. Hoặc cho vui. : p

Dù sao, có một số cách bạn có thể xử lý. Rất nhiều phần mềm sử dụng tên chuỗi (và có thể là công ty) và hàm băm để tạo khóa. Điều này có lợi thế là không đổi (miễn là tên là như nhau, băm là, và do đó, khóa là). Nó cũng là một hệ thống rất đơn giản, đặc biệt nếu bạn sử dụng một băm nổi tiếng như MD5.

hash = md5(name); 

Một số ứng dụng fancier sử dụng một chức năng nội bộ để tạo ra một mã xác nhận của một số loại, và khi bạn kết hợp đó và tên được đặt, bạn có thể tạo (và gửi lại) một băm.

validCode = getCode(name); 
hash = myHash(name^validCode); 

Một số ít sử dụng mã dựa trên hệ thống (Windows là ví dụ hay), nơi nó lấy mẫu phần cứng và tạo mã định danh từ phần cứng đó. Nếu bạn có thể nhận được tên của bộ vi xử lý hoặc tốc độ, hoặc bất cứ điều gì khác, bạn có thể chạy một cái gì đó như thế. Vấn đề duy nhất là thay đổi hệ thống có thể làm cho mã không hợp lệ, vì vậy bạn có thể cảnh báo người dùng của mình (và cho đi một phần quy trình) hoặc để họ tìm ra vô tình (không tốt).

sysID = processor_name() | ram_Speed(); 
hash = md5(sysID & name); 

Bạn có thể sử dụng bất kỳ sự kết hợp của hàm băm, dữ liệu được, đầu vào chuỗi, hoạt động boolean, vv Một điều cần xem xét là bạn không cần để có thể đảo ngược quá trình. Miễn là bạn có thể tái tạo nó với cùng một kết quả (bất kỳ hàm băm tốt nào có thể), bạn có thể kiểm tra các kết quả được băm với nhau và chắc chắn rằng nó hợp lệ. Bạn càng đưa vào, nó càng phức tạp, nhưng sẽ càng khó crack hơn.

Hy vọng rằng sẽ giúp với câu hỏi của bạn.

+1

Đó là giá trị bao gồm một bí mật trong chuỗi được băm. Bất kỳ kẻ tấn công có thể chỉ đơn giản là MD5 tên riêng của họ, thêm một bí mật (và sử dụng một băm an toàn hơn như SHA-2) làm cho nó khó khăn hơn. Tất nhiên, bí mật cần được đưa vào phần mềm và có thể được trích xuất. XOR nó với một chuỗi khác (tốt hơn là có vẻ như đó là một chuỗi được sử dụng trong phần mềm) sẽ giúp che giấu nó. – Martin

6

tôi sử dụng một hệ thống như thế này:

• tạo ra một chuỗi từ chính cửa sổ giấy phép + bản dùng thử ngày giai đoạn cuối

• tạo một hash (Sha/md5) từ chuỗi

• convert ngày kết thúc dùng thử cho một int (ví dụ: Số ngày)

• khóa trở thành ngày kết thúc dùng thử + một số phần của băm

• chuyển đổi chìa khóa để chỉ các ký tự chữ hoa để làm cho nó dễ dàng hơn để nhập

ABCD-DEFG-HIJK ...

xác nhận hoạt động như

• Phím chuyển đổi sang byte nữa

• chiết xuất thử nghiệm ngày kết thúc

• tạo chuỗi từ chính cửa sổ giấy phép + ngày kết thúc thử nghiệm

• băm

• so sánh băm với phần còn lại của khóa

điều này làm cho khán giả gặp khó khăn.

+1

Cảm ơn. Cách tiếp cận này rất giống với những gì tôi đang làm. Tôi cần kết hợp một số yếu tố để làm cho nó có thể tái sản xuất và duy nhất đối với bản cài đặt có ngày hết hạn và thông tin khác. – giulio

0

Khóa cấp phép khá vô dụng theo ý kiến ​​trung thực của tôi.
Điều gì ngăn khách hàng của bạn phân phối khóa đó cho người khác? Chắc chắn bạn có thể thiết lập một máy chủ khóa cấp phép ghi lại số lần kích hoạt nhưng chi phí tiền và điều gì sẽ xảy ra nếu nó bị hỏng hoặc biến mất?

Theo ý kiến ​​chuyên môn của tôi, hãy tạo một phần mềm được gắn thương hiệu duy nhất cho người dùng (được mã hóa bên trong chương trình của khóa học). Ví dụ: nếu bạn goto trợ giúp -> về phần mềm, sau đó hiển thị tên, điện thoại của người đó và có thể là địa chỉ của họ. Bằng cách này, nếu họ tải nó lên một trang web cướp biển của một số loại, không chỉ những người khác sẽ biết thông tin cá nhân của người này ... nhưng bạn cũng sẽ tính phí cho anh ta để có thêm giấy phép hoặc kiện anh ta.

+0

Tôi có thể lấy thông tin độc đáo ra khỏi môi trường kỹ thuật của người dùng hướng tới việc tạo khóa của họ. Vì vậy, nếu bất kỳ ai khác dự định sử dụng nó, hệ thống sẽ thực hiện việc kiểm tra, tạm dừng và nhắc nhập khóa hợp lệ dựa trên môi trường mới mà nó đang cố gắng chạy. Có, bạn có thể hack các hệ thống cấp phép tinh vi nhất từng được tạo. Microsoft đã cố gắng và thất bại và họ có dosh để ném vào nó. Nhưng điều này thực sự là một rào cản đối với nạn cướp biển thông thường. Nếu ai đó thực sự thực sự muốn hack nó họ sẽ .. Nhưng nguy cơ này là khá thấp xem xét những gì phần mềm là cho và thị trường mục tiêu. – giulio

2

Câu trả lời là không, không có thuật toán khóa cấp phép bảo mật nào không yêu cầu bằng chứng toán học để hiểu.

Khóa cấp phép tốt nhất là các khóa cấp phép được ký kỹ thuật số với thuật toán mã hóa không đối xứng. Bạn đăng nhập dữ liệu quan trọng bằng khóa mã hóa riêng và nhúng chữ ký vào khóa và xác thực khóa (có nghĩa là xác minh chữ ký trong số những thứ khác) được thực hiện bằng khóa công khai. Bằng cách này, không ai có thể tạo khóa cấp phép trừ khi họ có quyền truy cập vào khóa riêng tư đó là ... riêng tư. Vấn đề là có rất ít (và khó khăn) các thuật toán có kích thước chữ ký đủ ngắn để nhúng vào một khóa sản phẩm. RSA không phải là một trong số chúng (kích thước chữ ký cho RSA512 là 1024 bit - quá nhiều).

Bạn có thể xem SoftActivate Licensing SDK sử dụng mật mã đường cong elip để tạo các khóa cấp phép ngắn, kỹ thuật số có chữ ký (mã nguồn C++/C#).

+4

Ngoài ra, nếu bạn tìm kiếm SoftActivate trực tuyến, bạn có thể tìm thấy các vết nứt keygen cho nó. Điều đó sẽ cho bạn biết mức độ hữu ích của nó. –

1

Vì bất kỳ thuật toán bạn thực hiện đang xảy ra để có được tấm tôi sẽ làm một cái gì đó đơn giản như thế này:

const string secretMumboJumbo = "sdfkldafskjlfajmkldsfjaewumaskldfladkkldsfklj" 

//For you to generate keys 
string GenerateLicenceKey(int idNr) 
{ 
    return Sha1Hmac(key=secretMumboJumbo, messageToEncode=idNr) 
} 

//For clients to check if key is valid, 
bool IsKeyValid(string key) 
{ 
    for(int i=0;i<maxNrOfLicenceKeys;i++) 
     if(key == GenerateLicenceKey(i)) 
     return true; 
    return false; 
} 

Có lẽ việc kiểm tra có thể trở nên quá chậm vì nó phải cố gắng mỗi phím có thể nhưng điều đó cũng có thể là một điều tốt để tránh bị ép buộc.

Hầu hết các khung công tác phải có hàm HMAC cho SHA1 hoặc một số hàm băm khác. Trường hợp tệ hơn, bạn có thể thay thế điều này bằng md5 (khóa + id)

Không thực hiện thuật toán này quá nghiêm túc, nó chỉ là một ví dụ và có thể bị hỏng rất dễ dàng vì khóa thế hệ phải được bao gồm trong ứng dụng khách , mặc dù nó ẩn trong nhị phân ở đâu đó.

+0

Cảm ơn, tôi đã xem xét SHA-1 và thấy đó là một hit hiệu suất đáng kể, md5 là một lựa chọn. Tôi đã nghiên cứu các lớp được viết bằng J2SE thuần túy. Chúng không an toàn, nhưng cải thiện hiệu suất là đáng kể. – giulio

+1

@giulio Hiệu suất đạt được? Làm thế nào để bạn có thể tạo ra các khóa cho mỗi giây? Đối với người dùng nhập khóa, đó là sự kiện một lần (hoặc một lần cho mỗi lần tải). Để tạo ra chúng ... tôi cũng muốn chạy phần mềm bán hàng kinh doanh, nơi tạo ra thế hệ quan trọng trở thành mối quan tâm về hiệu suất. Nhiều thuật toán tạo khóa có ý định thực hiện tồi tệ để ngăn chặn các cuộc tấn công bạo lực. Tuy nhiên, hiệu suất đó chỉ đạt bình thường trở thành một cổ chai nếu bạn ... thực hiện các cuộc tấn công bạo lực. – Martin

Các vấn đề liên quan