12

Androidのユーザーからパスワード文字列を取得したい。

この文字列は、ユーザーが入力してからコード内のcharまたはbyte配列に到達するまでのプロセスのどの時点でも、Java文字列に格納されたくありません。

この理由は、機密データにJava文字列を使用することに対するSunの差し止め命令です。 「String型のオブジェクトは不変です。つまり、使用後にStringの内容を変更(上書き)またはゼロにするメソッドは定義されていません。この機能により、Stringオブジェクトはユーザーパスワードなどのセキュリティ上の機密情報の保存には適していません。代わりに、セキュリティ上の機密情報を常に収集してchar配列に保存する必要があります。」 http://docs.oracle.com/javase/1.5.0/docs/guide/security/jce/JCERefGuide.html#PBEEx

したがって、内部で文字列を使用するため、EditTextを使用できません(char[]またはChar[]?によってバックアップされる可能性のあるEditableを返しますが)。

ユーザーからchar配列を受け入れる最も簡単な方法は何ですか?重要なイベントをリッスンするCanvasを推測していますか?

4

3 に答える 3

11

内部で String を使用している EditText.java (API 17) が表示されません。わずか 2 ページの長さのコードです。もちろん、EditText が継承した TextView.java ファイルには 9k 行あります。String を内部で使用している TextView.java はまだ表示されませんが、CharSequence 用の CharWrapper の独自の実装があります。(TextView.java 行 #8535 API 17)。ここにメソッド呼び出し getChars があります。お気づきのように、これは String ではなく char[]bufからコピーされます。mChars

    private char[] mChars;
    public void getChars(int start, int end, char[] buf, int off) {
        if (start < 0 || end < 0 || start > mLength || end > mLength) {
            throw new IndexOutOfBoundsException(start + ", " + end);
        }

        System.arraycopy(mChars, start + mStart, buf, off, end - start);
    }

あとは、getChar を呼び出して、入力する char[] を渡すだけです。

            int pl = mPasswordEt.length();
            char[] password = new char[pl];
            mPasswordEt.getText().getChars(0, pl, password, 0);

char[] passwordString を使用せずに必要なものがあります。作業が終了したら、次のようにメモリからクリアできます。

Arrays.fill(password, ' ');
于 2013-04-05T21:55:36.730 に答える
0

アプリケーションで発生する可能性のある状況は 2 つあります。

  1. すべてのアプリケーションは、環境内で適切にサンドボックス化されています。この場合、パスワードについて心配する必要はありません。他のプロセスはプロセス メモリにアクセスできないためです。そこに文字列または byte[] 配列があるかどうかは関係ありません。

  2. スーパーユーザー アクセスを持つ不正なアプリケーションがあります。この場合、パスワードを傍受する場所が多すぎるため、文字列についても心配する必要はありません。そのため、文字列は、心配すべきことのリストの一番下に近いはずです。

于 2012-05-01T09:23:49.677 に答える
-1

EditableCharSequenceこれは、ドキュメントによると、「読み取り可能な一連の値char」です。

于 2012-05-01T06:26:14.303 に答える