Zxcvbn+RxBinding에 입력한 암호의 강도를 확인합니다.

8504 단어 AndroidRxJava

EditText에 입력된 암호를 감지하고 강도를 검사하는 내용을 여기. 기사에 소개한 덕분에 시도해 봤습니다.
RxBinding은 RxJava2를 지원하기 때문에 이 기사에서 그것을 사용했습니다.

라이브러리 준비


다음 프로그램 라이브러리를 사용합니다.
  • RxJava2

  • RxBinding2  
  • zxcvbn4j
  • app/build.gradle
        compile "io.reactivex.rxjava2:rxjava:2.1.3"
        compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
        compile 'com.nulab-inc:zxcvbn:1.2.3'
    
    ※ 상기 내용은 기재되지 않았으며, 사용retrolambda은 λ식으로 기술합니다.

    zxcvbn4j


    드롭박스가 공개한 비밀번호 강도 체크라이브러리zxcvbn의 자바 이식판은 뉴랩이 공개했다.
    README에 기재된 바와 같이 사용 방법도 매우 간단하고 measure 방법에 문자열을 전달하면 결과를 얻을 수 있다.
    Zxcvbn zxcvbn = new Zxcvbn();
    Strength strength = zxcvbn.measure("This is password");
    

    레이아웃 생성하기


    암호를 입력할 EditText를 추가합니다.
    <EditText
        android:id="@+id/password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPassword"
        android:maxLines="1" />
    
    입력한 암호에 따라 결과를 표시하는 View를 추가합니다.
    zxcvbn의 점수는 0~4의 정수이기 때문에android:max="4".
    비고정 암호 [0]<-->[4] 고정 암호
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    
        <ProgressBar
            android:id="@+id/password_strength_bar"
            style="?android:progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:max="4" />
    
        <TextView
            android:id="@+id/password_strength_text"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="4"
            android:gravity="center"
            android:minLines="2" />
    
    </LinearLayout>
    

    입력을 체크하고 결과를 업데이트합니다.


    RxBinding을 사용하여 EditText의 내용 변경을 알리고 zxcvbn으로 점수를 측정하여 다른 View에 결과를 전달합니다.
    SignUpActivity.java
    Zxcvbn zxcvbn = new Zxcvbn();
    // EditTextをObservable化
    RxTextView.textChanges(mPasswordEditText)
         // スコアの測定は計算スレッドで行う
            .observeOn(Schedulers.computation())
            .map(CharSequence::toString)
            .map(zxcvbn::measure)
         // 0〜4の整数でスコアを取得
            .map(Strength::getScore)
             // メインスレッドで他のViewに渡す
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(score -> {
                mStrengthProgressBar.setProgress(score);
                mStrengthTextView.setText(PASSWORD_STRENGTH_MESSAGES[score]);
            });
    
    여기서 다음 정렬을 준비하여 TextView에 분수에 해당하는 텍스트를 전달합니다.
    private static final String[] PASSWORD_STRENGTH_MESSAGES = new String[] {
            "Weak", "Fair", "Good", "Strong", "Very Strong"
    };
    
    원시문에서는 M i s sing Backpressure Exception을 피하기 위해 .onBackpressureLatest()를 지정했지만 RxJava2에서는 BackProessure가 Flowble 기능만 가지고 있었다.
    Flowble는 서버 쪽에서 대량의 데이터를 처리하는 경우를 구상했다. GUI 이벤트 정도의 소량의 데이터라면 비용이 적은 Observable를 사용하는 것이 좋기 때문에 삭감하고 있다.
    https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#observable-and-flowable
    매번 입력할 때마다 불필요하게 처리하지 않으려면 Throttling 입력 후 간격이 있으면 알려주는 것이 좋다.

    기타

    strength.getScore()가 아니라strength.getFeedback()면 비밀번호에 대한 피드백을 받을 수 있다.
    현지화도 대응getFeedback().getSuggestions(Locale.JAPAN)하면 위와 같은 GIF처럼 일본어로 수정된 제안을 받을 수 있다는 소식이다.편리합니다!

    좋은 웹페이지 즐겨찾기