非対称暗号化で妥当な長さのライセンスキーを生成しますか?

StackOverflow https://stackoverflow.com/questions/2726105

  •  02-10-2019
  •  | 
  •  

質問

私はこれを一日中見てきました。私はおそらく数時間前にそれから離れていたはずです。私はこの時点で明らかな何かを見逃しているかもしれません。

ショートバージョン:非対称的に暗号化されたハッシュを生成して、妥当な数の人間の読み取り可能なキャラクターに生成して煮詰める方法はありますか?

ロングバージョン:

ソフトウェアのライセンスキーを生成したいです。これらのキーを妥当な長さ(25〜36文字)にし、人間が簡単に読んで入力することを望みます(したがって、番号0やキャピタルレターoのようなあいまいなキャラクターは避けてください)。

最後に、これはキッカーのようです - 私は本当に非対称暗号化を使用して、新しいキーを生成することをより困難にするのが好きです。

一般的なアプローチがあります。情報(ユーザー名、製品バージョン、塩)を弦に連結し、そこからSHA1()ハッシュを生成し、ハッシュを秘密鍵で暗号化します。クライアントでは、同じ情報からsha1()ハッシュを構築し、公開キーでライセンスを復号化して、私が一致しているかどうかを確認します。

これはMacアプリであるため、AquaticPrimeを見ましたが、文字列ではなく比較的大きなライセンスファイルを生成します。必要に応じて作業することができますが、ユーザーとして、読んで印刷できるライセンスキーの利便性が本当に好きです。

また、キーを生成するCocoafobも見ましたが、とにかくファイルとして配信したいほど長いです。

OpenSSLでだまされた しばらくの間ですが、妥当な長さを思い付くことができませんでした。

だから...私はここで何か明白なものが足りないのですか?非対称的に暗号化されたハッシュを生成して、妥当な数の人間の読み取り可能なキャラクターに生成して煮詰める方法はありますか?

私はソリューションを購入することを受け入れています。しかし、私は多くの異なるプラットフォームに取り組んでいるので、ポータブルなものが欲しいです。私がこれまで見てきたものはすべて、プラットフォーム固有のものでした。

解決策に感謝します!

PS-はい、私はそれがまだ割れていることを知っています。私は、ユーザーとして、私はまだ友好的だと思うという合理的な何かを考え出そうとしています。

役に立ちましたか?

解決

残念だけど違う。短くすると、情報が失われ、元のハッシュを再現できなくなります。

ただし、これを試してみることができることがいくつかあります。

  • Base32を使用します。あいまいではないアルファベット内の利用可能なすべての文字にマップします。 (0VSOなど)
  • DSAを使用すると、RSAよりもコンパクトになる傾向があります。
  • 入力を短くする(たとえば、SHA1ハッシュを切り捨てたり、代わりにMD5を使用したりするなど)、出力も短くなる可能性があります。

他のヒント

各SHA1文字をヘックスとして扱い、おそらく不必要なフォーマット(ダッシュまたはブラケット)をドロップし、アレイマッピングを使用して、ランダムな順序でAPと同様に0-9A-Fを変換し、「人間」が入力したテキストとして使用します。 MD5は、SHA1の32枚またはさらにいくつかを提供します。 charをsha1/md5 string/bytesに戻すマップを解除して、そこから進みます。

暗号化の部分では答えませんが、登録インターフェイスを開始し始めたのは、インターフェイスが発生したときにクリップボードのテキストを確認することです。クリップボードにテキストが存在する場合は、ユーザーがどこか(電子メール、Webページなど)から登録情報をコピーしたかどうか、およびその情報を見つけた場合、スキャンしてください。 たぶん......だろう 登録情報/キーになり、登録インターフェイスを事前に入力してください。

また、インターフェイスに小さなアラートを表示することをお勧めします。これは、ユーザーが何が起こったか、起こらなかったかを知っているので、情報がクリップボードから正常にスクレイプされたことを示しています(またはそうではありません!)。

現在、短いライセンスキーを作成するための最良の署名ベースの方法は、現在 Boneh – Lynn -Shacham署名スキーム, 、それはむしろ最近の(それほど多くのレビューではありません)、一般的な暗号ツールには実装されていません。

一般的な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」ヘッダーchar)。私が知る限り、現時点ではOpenSSLでより短い署名を生成することはできません。

MD5アルゴリズムを検討します。それは広く実装されており、入力サイズに関係なく32文字の英数字文字列を生成します。アルゴリズムをSHA1ハッシュに適用すると、探しているものかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top