728x90
안녕하세요 :)
이번에는 안드로이드에서 비밀번호를 hash 암호화 하는 방법에 대해 알아보겠습니다.
아래에 예제가 포함되어 설명되긴 하지만,
좀더 손쉽게 사용가능한 방법으로 스틱코드 extension을 IDE에서 사용하신다면,
해당 링크의 포스트 글을 즐겨찾기 하시는 것으로 손쉽게 코드를 사용하실 수 있습니다.
https://stickode.com/detail.html?no=2708
단방향 해시 함수란?
단방향 해시 함수는 수학적인 연산을 통해 원본 메시지를 변화화여 암호화된 메시지인 다이제스트(digest)를 생성하는 함수를 뜻합니다.
원본 메시지를 알면 암호화된 메시지를 구할수 있지만, 반대인 암호화된 메시지로 원본 메시지를 구할 수 없기 때문에 '단방향' 이라고 부릅니다.
이런 알고리즘에는 여러가지가 존재하는데
- SHA
- MD
- HAS
이중 가장 대표적인 해시 알고리즘은 SHA-256입니다.
이후에는 예제를 보면서 설명하겠습니다.
예제 코드
MainActivity
public class MainActivity extends AppCompatActivity {
EditText pwdEt; //password 값 입력 위젯
Button pwdToHashBtn; //버튼
TextView digestTv; // 비밀번호 암호화된 결과 출력
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//layout 에서 파싱
pwdEt = findViewById(R.id.pwd_et);
pwdToHashBtn = findViewById(R.id.pwd_hash_btn);
digestTv = findViewById(R.id.digest_tv);
//버튼 클릭 이벤트 리스너 등록
pwdToHashBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String pwd = pwdEt.getText().toString();
//string null, empty 체크 -> 만약 비었다면 함수 종료함
if(pwd.isEmpty()){
return; //함수 종료
}
pwd = getHash(pwd); // pwd를 암호화함
digestTv.setText(pwd); //암호화된 pwd 를 textView 에 출력
}
});
} //onCreate
// *** 스틱코드 등록 코드 ***
public static String getHash(String str) {
String digest = "";
try{
//암호화
MessageDigest sh = MessageDigest.getInstance("SHA-256"); // SHA-256 해시함수를 사용
sh.update(str.getBytes()); // str의 문자열을 해싱하여 sh에 저장
byte byteData[] = sh.digest(); // sh 객체의 다이제스트를 얻는다.
//얻은 결과를 string으로 변환
StringBuffer sb = new StringBuffer();
for(int i = 0 ; i < byteData.length ; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
digest = sb.toString();
}catch(NoSuchAlgorithmException e) {
e.printStackTrace(); digest = null;
}
return digest;
}
// *** 스틱코드 등록 코드 ***
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<EditText
android:id="@+id/pwd_et"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:hint="비밀번호 입력하기"
android:inputType="textPersonName"
android:minWidth="290dp"
android:minHeight="48dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:text="암호화된 비밀번호"
android:textColor="@color/black"
android:textSize="16sp"
app:layout_constraintStart_toStartOf="@+id/pwd_et"
app:layout_constraintTop_toBottomOf="@+id/pwd_hash_btn" />
<Button
android:id="@+id/pwd_hash_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:text="비밀번호\n암호화 하기"
app:layout_constraintEnd_toEndOf="@+id/pwd_et"
app:layout_constraintStart_toStartOf="@+id/pwd_et"
app:layout_constraintTop_toBottomOf="@+id/pwd_et" />
<TextView
android:id="@+id/digest_tv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
app:layout_constraintEnd_toEndOf="@+id/pwd_et"
app:layout_constraintStart_toStartOf="@+id/pwd_et"
app:layout_constraintTop_toBottomOf="@+id/textView" />
</androidx.constraintlayout.widget.ConstraintLayout>
예제 시현
'안드로이드 자바' 카테고리의 다른 글
[JAVA][Android] Youtube API 사용법 (0) | 2022.01.07 |
---|---|
[JAVA][Android] 녹음 기능 만들기 (0) | 2021.12.31 |
[Java][Android] 복사하여 붙혀넣기 (0) | 2021.12.29 |
[JAVA][Android] 사진 다운로드 하기 (0) | 2021.12.19 |
[JAVA][Android] Retrofit으로 데이터 insert하기 (0) | 2021.12.11 |