2010-04-28 51 views
5

我一直在看這一整天。幾個小時前我應該已經走開了;在這一點上,我可能會漏掉一些明顯的東西。使用非對稱加密生成合理長度的許可證密鑰?

簡短版本:有沒有一種方法可以生成一個非對稱加密散列並將其歸結爲合理數量的明確的,人類可讀的字符?

龍版本:

我要生成的許可證密鑰我的軟件。我希望這些鍵具有合理的長度(25-36個字符),並且可以方便地讀取和輸入(避免模糊字符,例如數字0和大寫字母O)。

終於 - 這似乎是踢球 - 我真的很喜歡使用非對稱加密,使其更難以生成新的密鑰。

我已經有了一般的方法:將我的信息(用戶名,產品版本,鹽)連接成一個字符串,並從中產生一個SHA1()哈希,然後用我的私鑰加密哈希。在客戶端上,根據相同的信息構建SH​​A1()哈希,然後用公鑰解密許可證,看看是否有匹配。

由於這是一款Mac應用程序,因此我查看了AquaticPrime,但生成的是相對較大的許可證文件而非字符串。如果必須的話,我可以使用它,但作爲用戶,我真的很喜歡我可以讀取和打印的許可證密鑰的便利性。

我也看了一下CocoaFob,它確實生成了一個鍵,但是我想要把它作爲一個文件傳遞,這是很長的。

fooled around with OpenSSL一段時間,但不能拿出任何合理的長度。

所以......我錯過了一些明顯的東西嗎?有沒有一種方法可以生成並將不對稱加密的散列生成併合理化爲合理數量的明確的,人類可讀的字符?

我願意購買解決方案。但是我在很多不同的平臺上工作,所以我想要一些可移植的東西。到目前爲止,我看過的所有內容都是平臺特定的。

很多非常感謝您的解決方案!

PS - 是的,我知道它仍然會被破解。我試圖想出一些合理的東西,作爲一個用戶,我仍然會覺得友好。

+0

答案似乎是:不,你不能。如果有人能證明我錯了,我會留下這個問題,但從我能告訴它只需要很多字節來加密散列,就是這樣。我最終使用CocoaFob,到目前爲止沒有人抱怨(荒謬)很長的許可證密鑰。 – starkos 2010-06-18 22:47:52

+2

作爲一個興趣點:我的應用程序,不明原因,在不到24小時內被破解。但它要求可執行文件在他們的keygen工作之前進行修補(他們用自己的公鑰替換掉我的公鑰)。我可以輕鬆地打破每個新版本的補丁(只需將鍵盤洗牌),以便我可以忍受它。 – starkos 2010-06-18 22:50:07

+0

Base58編碼消除了不明確的字符。 – zaph 2016-06-03 13:27:53

回答

1

不幸的是,沒有。如果縮短了時間,則會丟失信息,並且無法重新創建原始散列。

然而,這裏的一對夫婦的事情,你可以嘗試:

  • 使用base32。將其映射到字母表中所有可用的不含糊的字母。 (0vsO等)
  • 使用DSA,它往往比RSA更緊湊。
  • 讓您的輸入較短(截斷SHA1哈希值,或使用MD5代替,例如)可能使輸出更短了。
+0

截斷散列,然後使用較少的位進行加密,聽起來像是一個很好的建議。 – starkos 2011-01-06 11:59:44

0

我會考慮MD5算法。它被廣泛實施,並將生成一個32個字符的字母數字字符串,而不管輸入大小。將算法應用於SHA1哈希,它可能是您要查找的內容。

+1

MD5只會在SHA1上保存四個字節,並且不管它是不是加密,只是一個散列。任何知道輸入數據的人都可以生成自己的許可證密鑰。通過添加私鑰/公鑰對,他們將無法在沒有私鑰的情況下創建新的許可證。 (他們仍然可以破解二元,但是這是一個不同的問題) – starkos 2010-04-28 01:20:41

0

將每個SHA1字符視爲十六進制,可能會刪除任何不必要的格式(破折號或括號),使用某些數組映射將0-9A-F轉換爲某種隨機順序的AP,將其用作「人類」文本。 MD5會給你32字符或SHA1的幾個字符。取消將字符映射回您的SHA1/MD5字符串/字節並從那裏繼續。

+0

好的,但問題是「有沒有辦法......歸結一個非對稱加密哈希值。 – starkos 2010-06-18 22:40:07

+0

我不認爲它很重要,你如何到達在字節/字符串處,不對稱或不對稱散列輸出被設計爲佔用位空間,即:128位,160位等。您可以按原樣或後處理它:截斷它或無論如何你都可以將它燒掉,但是你將失去哈希的獨特性和/或哈希的加密強度。一個簡單的截斷應該可以工作並且'足夠好',在內部提供你可以計算滿哈希與您開始用trucated部分比較之前 – andora 2010-06-19 15:12:38

+0

分發非對稱密鑰的哈希值是沒有意義的。!你必須包括在客戶端私鑰來驗證哈希我計算哈希值,然後將其加密,*那*是我的(長)許可證密鑰。 – starkos 2010-06-21 14:07:05

0

我不會回答加密部分,但我已經開始做註冊接口的事情是在接口被引發時檢查剪貼板的文本。如果文字是出現在剪貼板,掃描,以查看用戶是否已經從地方複製他們的註冊信息(電子郵件,網頁等),如果你發現信息可能是你的註冊信息/鍵,預 - 用它來填充註冊界面。

它也表明,表明信息已成功從剪貼板刮接口上的一個小警告一個好主意(或不!)只是讓用戶知道什麼做了或沒發生。

0

基於最佳簽名的方法來創建短許可證密鑰目前似乎是the Boneh–Lynn–Shacham signature scheme,雖然它是相當新近(沒有太多評論),並沒有在普通的加密工具中實現。

這是一種與普通的OpenSSL和bash做到這一點:

openssl ecparam -genkey -name sect113r1 -out private.key # generate the private key (store it on your server) 
openssl ec hist-in private.key -pubout -out public.key # generate a public key (store it in the client software) 
# generate a random one time activation userID or a hardware-based one here (CLIENT SIDE) 
user_id="unique_on_the_fly_generated_user_ID" # send the user ID to the server for license generation 
signature="" 
return_value=0 
while [[ $return_value == 0 ]] 
do 
    signature=$(echo "$user_id" | openssl dgst -sign private.key | base64 > signature.txt) # generate a user licence 
    echo "$signature" | egrep -q 'O|l|/|\+|=' # check for ambiguous chars 
    return_value=$? 
done 
echo "$signature" | base64 -d > signature.txt # send the signature/license to the client 
openssl dgst -verify public.key -signature signature.txt # verify signature (CLIENT SIDE) 

注意,你仍然可以得到一個48個字符長的簽名/許可密鑰(外加一個通用的「M」頭字符則可以避免發送)。據我所知,目前無法用openssl生成較短的簽名。