24

私は、ユーザーが操作を実行するためにサインインする必要のあるアプリを開発しています...しかし、主にアンドロイド端末のpplは「私をサインインしてください」...そして、私は、私のアプリ内のユーザー名とパスワードの値を維持する必要があります。私は環境設定やSQLite Dbを使うべきですか、それとも何か他のものがあり、どうすればそれを安全にすることができますか? Plzをヘルプ... 事前に感謝..非常に少なくともアンドロイドアプリにユーザー名とパスワードを保存するための最善の選択

+0

これは正常に動作します:http://stackoverflow.com/a/19629701/5733853 – HPbyP

答えて

4

は、SharedPreferences(プライベートモード)に保管し、ハッシュパスワードを忘れてはいけません。これは悪意のあるユーザー(またはルートされたデバイス)と実際には違いはありませんが、それは何かです。

+0

してくださいパスワードをハッシュする方法のいずれかのチュートリアルを?私はその考えに興味があります。誰もその技術で保存されたパスワードを取得することはできませんか? – androniennn

+1

@androniennnパスワードをハッシュする方法については_ton_チュートリアルがありますので、Googleにお知らせします。念頭に置いておくべきことの1つは、ハッシングが_casual_スヌーパを邪魔することだけであるということです。この手法は、デバイスがルーツされている場合(たとえば)、悪意のあるユーザーがバイナリにアクセスする場合には影響ありません**。誰かがあなたのプログラムをリバースエンジニアリングすることができれば、あなたはパスワードをハッシュしたことを簡単に理解することができます。可能性はすべて知っておく必要があります:) –

+0

良い方法/技術ですが、100%確実で安全なもの:\ – androniennn

25

はい、これはAndroidでは難しいです。基本的なパスワードを環境設定に保存したくないのは、根ざしたデバイスを持つ人は基本的にパスワードを世界に表示するためです。反面、暗号化されたパスワードを使用することはできません。これは、暗号化/復号化キーをデバイスのどこかに格納しなければならず、ルート攻撃の影響を受けやすくなります。

私がしばらく前に使った解決策の1つは、サーバーに「チケット」を生成させて、それをデバイスに戻すことです。これは、一定の期間有効です。このチケットは、すべての通信のためにデバイスで使用され、SSLを使用しているため、チケットを盗むことはできません。このようにして、ユーザーはサーバー上のパスワードを一度認証し、サーバーは有効期限切れのチケットを送り返し、パスワードは決して装置のどこにも保存されません。

OpenID、Facebook、Google APIなどの3つの認証メカニズムがこのメカニズムを使用しています。短所は、チケットが期限切れになるたびに、ユーザーが再ログインする必要があることです。

最終的には、アプリケーションの安全性の程度によって異なります。これが単にユーザーを区別するだけで、銀行口座や血液型のような超秘密情報が格納されていない場合は、pwdをデバイスに平文で保存するといいかもしれません:)

幸運なことに、あなたの特定の状況に最適です!

編集:このテクニックはサーバーにセキュリティの責任を移すことに注意してください。サーバー上のパスワード比較に塩漬けされたハッシュを使用することをお勧めします。これについての他のコメント質問。これにより、デバイス上のEditText View、サーバーとのSSL通信、およびサーバーのRAMが暗号化されパスワードをハッシュしている以外は、プレーンテキストパスワードがどこにも表示されなくなります。これは決してディスクには保存されません。これはGood Thing(tm)です。

+3

私はあなたが技術的に言ったすべてに同意します。しかし、私はあなたの血液型がより公的であると感じる、緊急の場合に保存する可能性が高い) –

+2

データが超秘密でないかどうかは関係ありません、ユーザーは多くの場所で同じユーザー/パスワードを使用できます攻撃者はそれらを取得してさまざまなサービスを試すことができます。 –

22

他の人は、データを完全に保護するためにAndroidにパスワードを保存する安全な方法はないと言われています。パスワードのハッシュ/暗号化は素晴らしいアイデアですが、それは "クラッカー"を遅くすることだけです。言ったことで

、これは私がやったことです:

1)私は、種子やテキストを取り、それを暗号化しているこのsimplecryto.java classを使用。 2)プライベートモードでSharedPreferencesを使用しました。ルートにないデバイスの保存ファイルを保護します。 3)simplecrytoに使用したシードは、decompilersでStringよりも検索するのが少し難しいバイトの配列です。

私のアプリケーションは最近、私の会社が採用した「白い帽子」セキュリティグループによってレビューされました。彼らはこの問題にフラグを立て、OAUTHを使用するべきだと示しましたが、LOWリスクの問題として挙げました。

「クラッカー」は、デバイスに物理的にアクセスし、それをルートし、シードを見つけるのに十分注意する必要があることに注意してください。

本当にセキュリティを気にしている場合は、「ログインしてください」というオプションはありません。

+0

チュートリアルのリンクが壊れているので、同じであるかどうかはわかりませんが、すぐにGoogleが私にかなり似ている記事を表示しました:http://www.androidsnippets.com/encryptdecrypt-stringsセキュリティを向上させるために、デバイスから離れて保存されているランダムに生成されたシードを使用することができます。この共有シークレット/シードは、ユーザごとにランダムに生成され、オフデバイスストレージにはマッピングが含まれます。あなたが安全にその場所と情報を安全に交換し、そのストレージが安全である限り、それはうまくいかないでしょうか? – batbrat

+1

@batbratサーバー側の永続ユーザー状態を使用する場合は、自国のものよりもoauth2を推奨します。私の例では、ユーザーの状態はないので、私は何も呼び出すことができませんでした。 – knaak

+0

ありがとうございます。私は今より良く理解し、同意します。 – batbrat

1

セキュリティを危険にさらすことなく、これを行うための最も安全な方法はにログインする最後の人のユーザー名のみを格納するための共有設定を使用することである。

また、ユーザーのあなたのテーブルに、数値を保持コラムをご紹介しますブーリアン(1または0)は、その人をチェックした人が「私を覚えている」チェックボックスをチェックしたかどうかを表します。

getSharedPreferences()関数を使用してユーザー名を取得し、それを使用してホストされているデータベースを照会して、signedin列が1か0かどうかを確認します.1は「remember me」チェックボックスをオンにした人を示します。そこに文字列のキー変数を定義する代わりに、共有環境設定でそれを保存するかを定義するとともに、暗号化と復号化にNDKを使う

1
//encode password 
pass_word_et = (EditText) v.findViewById(R.id.password_et); 
String pwd = pass_word_et.getText().toString(); 
       byte[] data = new byte[0]; 
       try { 
        data = pwd.getBytes("UTF-8"); 
       } catch (UnsupportedEncodingException e) { 
        e.printStackTrace(); 
       } 
       String base64 = Base64.encodeToString(data, Base64.DEFAULT); 
       hbha_pref_helper.saveStringValue("pass_word", base64); 

//decode password 
String base64=hbha_pref_helper.getStringValue("pass_word"); 
      byte[] data = Base64.decode(base64, Base64.DEFAULT); 
      String decrypt_pwd=""; 
      try { 
       decrypt_pwd = new String(data, "UTF-8"); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 
+1

StackOverflowへようこそ! POがあなたの答えを理解するのを助ける説明をも提供できますか? – FrankS101

+6

Base64は暗号化されていないので、それは認識と解読が非常に簡単な暗号化アルゴリズムです。 –

0

は、文字列のXMLがスクリプトキディのほとんどに対して秘密鍵盗難を防止するのに役立つだろうINS。その結果得られた暗号テキストは、共有されたプリファレンスに格納される。 This link may help about the sample code

関連する問題