JAVA 해쉬를 이용한 패스워드 로그인

황제낙엽 2007.09.05 17:50 조회 수 : 111 추천:75

sitelink1  
sitelink2  
sitelink3  
sitelink4  
extra_vars5  
extra_vars6  
[Java 보안과 암호화] 문서 발췌클라이언트에서 서버로 평문을 전송하는 것을 피하기 위해서, 클라이언트는 평문 대신에 패스워드 메시지를 축약하여 보내게 되며,
서버는 보유하고 있는 패스워드 사본의 메시지 축약을 비교하여 두 개의 메시지 축약 내용이 같을 경우에 클라이 언트를 인증하게 된다.

·미리보기 | 소스복사·
  1. import java.io.DataInputStream;   
  2. import java.net.ServerSocket;   
  3. import java.net.Socket;   
  4. import java.security.MessageDigest;   
  5.   
  6. public class MasherServer {   
  7.   
  8.     public void exec(int port) throws Exception {   
  9.   
  10.     ServerSocket ss = new ServerSocket(port);   
  11.     System.out.println("Waiting.... port : " + port);   
  12.     Socket s = ss.accept();   
  13.     DataInputStream in = new DataInputStream(s.getInputStream());   
  14.   
  15.     // 클라이언트가 보낸 순서로 받는다.   
  16.     String user = in.readUTF();   
  17.     long time = in.readLong();   
  18.     double randomQ = in.readDouble();   
  19.     int leng = in.readInt();   
  20.     byte[] masherBytesIn = new byte[leng];   
  21.     in.readFully(masherBytesIn);   
  22.     byte[] masherBytesOut = UserMasher.makeDigest(user, getPassword(), time, randomQ);   
  23.   
  24.     if (isUser(masherBytesIn, masherBytesOut)) {   
  25.         System.out.println("Login");   
  26.     } else {   
  27.         System.out.println("No password");   
  28.     }   
  29.     in.close();   
  30.     }   
  31.   
  32.     private String getPassword() {   
  33.     return "rlarudwls";   
  34.     }   
  35.   
  36.     private boolean isUser(byte[] inBytes, byte[] outBytes) {   
  37.     return MessageDigest.isEqual(inBytes, outBytes);   
  38.     }   
  39.   
  40.     public static void main(String[] args) throws Exception {   
  41.     if (args.length < 1) {   
  42.         System.out.print("Input Port....");   
  43.         System.exit(0);   
  44.     }   
  45.     MasherServer ms = new MasherServer();   
  46.     ms.exec(Integer.parseInt(args[0]));   
  47.     }   
  48. }  
·미리보기 | 소스복사·
  1. import java.io.DataOutputStream;   
  2. import java.net.Socket;   
  3. import java.util.Date;   
  4.   
  5. public class MasherClient {   
  6.   
  7.     public void exec(String user, String password, String host, int port) throws Exception {   
  8.     Date date = new Date();   
  9.     long time = date.getTime();   
  10.     double randomQ = Math.random();   
  11.     byte[] masherBytes = UserMasher.makeDigest(user, password, time, randomQ);   
  12.     Socket s = new Socket(host, port);   
  13.     DataOutputStream out = new DataOutputStream(s.getOutputStream());   
  14.     out.writeUTF(user);   
  15.     out.writeLong(time);   
  16.     out.writeDouble(randomQ);   
  17.     out.writeInt(masherBytes.length);   
  18.     out.write(masherBytes);   
  19.     out.flush();   
  20.     out.close();   
  21.     }   
  22.   
  23.     public static void main(String[] args) throws Exception {   
  24.     if (args.length < 2) {   
  25.         System.out.print("Input Server address and port....");   
  26.         System.exit(0);   
  27.     }   
  28.     String user = "inter999";   
  29.     String password = "rlarudwls";   
  30.     MasherClient mc = new MasherClient();   
  31.     mc.exec(user, password, args[0], Integer.parseInt(args[1]));   
  32.     }   
  33. }  
·미리보기 | 소스복사·
  1. import java.io.ByteArrayOutputStream;   
  2. import java.io.DataOutputStream;   
  3. import java.io.IOException;   
  4. import java.security.MessageDigest;   
  5. import java.security.NoSuchAlgorithmException;   
  6.   
  7. public class UserMasher  {   
  8.     public static byte[] makeDigest(String user, String password, long time, double randomQ)   
  9.     throws NoSuchAlgorithmException {   
  10.         MessageDigest md = MessageDigest.getInstance("SHA");   
  11.         md.update(user.getBytes());   
  12.         md.update(password.getBytes());   
  13.         md.update(makeBytes(time, randomQ));   
  14.         return md.digest();   
  15.     }   
  16.   
  17.     public static byte[] makeBytes(long time, double randomQ) {   
  18.         try {   
  19.             ByteArrayOutputStream byteout = new ByteArrayOutputStream();   
  20.             DataOutputStream dataout = new DataOutputStream(byteout);   
  21.             dataout.writeLong(time);   
  22.             dataout.writeDouble(randomQ);   
  23.             return byteout.toByteArray();   
  24.         } catch (IOException ioe) {   
  25.             return new byte[0];   
  26.         }   
  27.     }   
  28. }  

번호 제목 sitelink1 글쓴이 날짜 조회 수
공지 [계속 추가중] SBOM 용어 정의   황제낙엽 2025.04.10 52
공지 [계속 추가중] Keycloak 용어 및 설정 옵션 정의   황제낙엽 2024.02.02 631
13 [Copilot] javax.crypto 패키지를 사용하여 암호화, 복호화 하는 방법   황제낙엽 2024.06.07 96
12 Apache Log4j 2 보안 업데이트 권고 https://www.boho.or.kr/data/secNoticeVie...ence=36389  황제낙엽 2021.12.13 134
11 OpenSSL사용방법 메모, RSA암호의 최대 사이즈, JCA/JCE가이드   황제낙엽 2007.09.27 173
10 Java Cryptography Extension (JCE) 개요   황제낙엽 2007.09.27 345
9 Java에서 암호화하고 C++에서 복호화하는 방법   황제낙엽 2007.09.27 378
8 비밀키를 Keytool에서 취급할 수 있는 형식으로 변환방법 http://java-house.jp/ml/archive/j-h-b/051472.html  황제낙엽 2007.09.27 229
7 공개키 암호화의 수학적 알고리즘과 자바 구현   황제낙엽 2007.09.22 207
6 RSA 암호화 알고리즘을 구현한 자바예제 (산술계산)   황제낙엽 2007.09.17 326
5 RSA 암호화 프로그램 예제 (BigInteger 이용) file   황제낙엽 2007.09.08 257
» 해쉬를 이용한 패스워드 로그인   황제낙엽 2007.09.05 111
3 Java 보안과 암호화 (개론) file   황제낙엽 2007.09.05 117
2 RSA 공개키 암호화 방식 (java.security, javax.crypto, au.net.aba.crypto.provider 패키지 이용)   황제낙엽 2007.09.05 279
1 자바 암호화 기법 - MD5를 이용한 해쉬키 생성 (Hash)   황제낙엽 2007.09.01 316