2011-06-23 41 views
0

我正在尋找創建自己的授權系統,我正在尋找不同的加密算法來創建一個密鑰。加密算法,可以在程序中解碼C#

我的第一步是base64_encode 3種不同的字符串,這樣的例子:

Name-Expiry-NumberPcs轉向 - >TmFtZS1FeHBpcnktTnVtYmVyUGNz

但後來我想給加密別的東西,但它必須全部內解碼該方案能夠提供信息。

需要考慮的另一件事是,我將使用PHP對密鑰進行編碼,以通過在線系統向客戶提供密鑰並將其輸入到C#程序中。

有什麼想法?

+0

你需要ecnryption,不散列 – sehe

回答

0

散列是一種單向操作:無法解碼散列值。

什麼你可能想在這裏做的是驗證哈希:當你的程序中使用的「活」的參數值在客戶端的系統上運行,創建一個全新的哈希值,並驗證生成的散列等於一個你已將客戶視爲關鍵。

這意味着當你的程序在客戶端上運行時,你將無法在散列中包含任何你無法可靠發現的信息。不幸的是,「有效日期」和「電池數量」屬於這一類。

如果您需要驗證此類信息,則散列值不適用,您需要使用加密來代替。加密有兩種口味:對稱和不對稱。

對稱加密意味着您的應用程序必須知道密鑰,以便它可以解密驗證代碼,這反過來意味着任何具有這種工作方式的中等工作知識的人都能夠破解它並生成他們想要的任何驗證碼。

在非對稱加密中,您有一個私鑰(用於加密)和一個用於解密的公鑰。如果你把這個公鑰提供給每個人都沒有問題,所以用這種方法不能爲你的程序設置一個keygen。

當然,這並不意味着你的應用程序將是破解安全的,因爲它真的很容易修改託管應用程序完全跳過碼驗證碼。

你問的問題實在是忌諱的,並沒有明確的答案。你可能想看看這個問題:https://stackoverflow.com/questions/5132943/licensing-system-for-net並按照SO上的幾十個類似的問題的鏈接。

+0

謝謝,這是信息和幫助我,我得到了散列和加密之間的混淆。因此,我將看看C#在加密方面的優勢。 –

0

你不想散列,因爲通過散列是一種方法。你想要某種加密。除非您使用不對稱加密,否則您的加密將僅僅是一種混淆,因爲您將密鑰放置在用戶可以訪問的位置。

在你的情況下,你可以首先UTF8編碼字符串來獲得一個字節數組。然後用AES加密這個數組,給你另一個字節數組。最後使用Base64對加密數據進行編碼以獲得可讀的字符串。

但是,由於您需要將密鑰嵌入客戶端,任何適度的黑客都可以爲您的程序編寫一個keygen。

您可以使用非對稱加密來避免嵌入式密鑰問題。但是,這導致很長的許可證密鑰。它可以防止鑰匙,但不會出現裂縫。

我建議使用第三方軟件作爲授權內容。或者,也許只是完全放棄它,因爲它會被破解,除非你的軟件太無趣了,沒有人會困擾。

0

我在C#(見System.Security.Cryptography)進行SHA256。但是,我不認爲哈希應該是可解碼的。目的是將某些敏感內容(如密碼)進行哈希處理,然後將相同的哈希例程應用於另一個值並比較兩個哈希值。

您似乎在尋找一種加密算法(例如AES)。與其他一些算法一樣,這在System.Security.Cryptography中也是可用的。

0

開箱即用,.NET提供了一個安全算法庫,符合標準密碼學。查看System.Security.Cryptography的文檔並選擇最適合您的算法。

Convert類具有靜態方法來轉換字符串tofrom Base64,所以在.NET中,就你而言,沒有問題。

我認爲你覆蓋得很好。只要確定你選擇了一些你感覺舒服的東西。並且要明白,當你選擇散列算法時,你將無法「解開」輸出,只能進行比較。

0

「哈希」,是根據定義,不能被解碼,althought一些蠻力黑客攻擊是可能的。

如果您需要解碼的代碼,您必須使用2路算法(如AES或DES)。

如果你不真正解碼,但只是檢查你存儲的哈希是否與用戶輸入相匹配,那麼你必須使用用於存儲哈希的相同算法對用戶輸入進行編碼,並檢查它們是否匹配(this是用於密碼的常見方法)

相關問題