2017-06-08 8 views
-1

私はアプリを逆行させていますが、私はAESアルゴリズムの専門家ではありません。 アプリケーションは、ユーザーにオフラインログインを行う機会を与えます。AES-256ベストプラクティスの実装

ユーザーは、これは、ユーザー

public void EncryptLoginInfo(string username, byte[] secretShared, byte[] salt) 
{ 
    byte[] random = calc.GenerateRandomBytes(); 
    byte[] array = aes.Encrypt(secretShared, random); 
    OfflineLogin loginInfo = new OfflineLogin() 
    { 
    Username = username, 
    SecretShared = array, 
    Iv = random, 
    Salt = salt 
    }; 
    this._userCredentials.StoreOfflineLoginData(username, loginInfo); 
} 

そして、このアールの情報を格納するために使用される機能です

パスワードを提供するように求めていますこれらの情報はアプリの内部設定ファイルの中に保存されています。ユーザーがオフラインでログインを行いたい場合は、以下の例では、encryptLoginInfoに渡さパスワード

Username: not_important 
SecretShared: 4KVrjy1cQVWYpWF7aolpMS0HzhKyFf+9VXauQrXoXVUbf0bGXIDOLDJuSVhYoFo2 
Iv:yil4nn02IoKsOnX5KXVsDg== 
Salt: 5kJio2VQEqjomHRdQMqRVJ0zkBsmqi8K3NypC2VWJk4 

で、彼は、ユーザー名と自分のパスワードを提供するように求めています。

質問:これは安全ですか?攻撃者はSecretShared + IV +塩を得ることができるならば、彼はユーザーのパスワードを回復することができる(つまり、この特定の例である)

これは

public void DencryptLoginInfo(OfflineLogin loginInfo) 
{ 
    byte[] array = aes.Decrypt(loginInfo.SecretShared, loginInfo.Iv); 
    loginInfo.SecretShared = array; 
    loginInfo.Iv = (byte[]) null; 
} 

があります復号化関数にありますあなたはこの実装のセキュリティ問題を見つけることができますか? 使用するアルゴはAES-256でなければなりません。。 SecretShared + Iv + Saltで与えられたPASSWORDを解読するために、PythonでPOCを実装できますか?

+3

達成しようとしているものは何ですか? * something *を暗号化してユーザーを認証しているのですか、または実際にユーザーのパスワードを使って有用なデータを暗号化していますか?スタックオーバーフローは、あなたの質問に合わないプログラミングに関する質問を扱うことに注意してください。 –

+0

パスワードを暗号化してユーザーを認証する – paolino

+1

@paolinoパスワードを暗号化するのではなく、パスワードベースのキー導出機能でハッシュする必要があります。申し訳ありませんが、あなたの質問を修正し、私は私の答えを修正することができます。 – TheGreatContini

答えて

1

あなたのコメントによれば、あなたの目標はユーザーを認証することです。そのために、パスワードベースのキー導出関数をパスワードに使用します。人々はこれを「ハッシュパスワード」と呼ぶことがあります。「ハッシュ」は何かを意味することがあるため、不幸な用語です。しかし、主なポイントは、パスワードを暗号化せず、遅くなるように設計された一方向性関数を使ってパスワードを送信することです。低速はブルートフォース攻撃を抑止する。

これを行うにはIVは必要ありません。代わりに、あなたのアプリは塩を派生し、パスワードベースのキー導出関数(「パスワードハッシュ」アルゴリズムと呼ばれることもある)を使用する必要があります。業界ではこのトピックに関する用語が混乱していると言い張ります。 。あなたはウェブ上でこれに関するガイダンスを見つけることができます。しかし、これを実装する際の一般的な落とし穴を確認するには、point 4 in Top 10 Developer Crypto Mistakesをお読みになることをお勧めします。

パスワードをキー(またはパスワードハッシュ)に変換するためにopensslを使用しないでください! opensslのアルゴリズムはweakです。 OpensslのEVP_BytesToKey()は低速の要件を満たしていないため、パスワードからブルートゥースで簡単にキーを操作できます。

この問題を適切に解決するには、bcryptやpbkdf2などのアルゴリズムを使用します(多くの努力をすることなくJava実装を見つけることができます)。パスワードから「ハッシュ」を導出します。次に、ユーザーが入力したパスワードとこのパスワード用に保存されたsaltを使用して同じ計算を再実行して、ユーザーがパスワードを正しく入力したことを確認します。一致した場合はアクセスが許可され、それ以外の場合はアクセスが拒否されます。

このアプリケーションがサーバーとやりとりする場合、通常はサーバー側でパスワードの確認を行います。あなたのアプリがサーバーとやりとりしない場合、あなたはそのデバイス上でそれを行う理由があるかもしれません。私はあなたのアプリが何をしているのかわからないので、あなたのために何が正しいか、間違っているかを伝えることはできません。

これを正しく行うための参考資料はHow to Safely Store Your Users' Passwords in 2016です。

+0

こんにちはgreatContini!私は必要なすべての情報で質問を更新しました。手伝ってくれてどうもありがとう。 – paolino

+0

@paolino secretSharedとパスワードの関係は何ですか?私はまた、aes.Decrypt()のAPIについてはっきりしていません。 secretSharedが解読されているようですが、どのキーが使用されているのかわかりませんし、操作モードもわかりません。これに答えるにはもっと情報が必要です。パスワードに – TheGreatContini

+0

secretShared? :)それは私が答えようとしている質問です:)。これらはすべてクライアントから抽出されたすべての詳細です。あなたの助けをたくさん感謝します – paolino

関連する問題