Android 보안 암호 화:Https 프로 그래 밍 상세 설명

Android 보안 암호 화 테마 글 인덱스
  • Android 보안 암호 화:대칭 암호 화
  • Android 보안 암호 화:비대 칭 암호 화
  • Android 보안 암호 화:메시지 요약 메시지 다이제스트
  • Android 보안 암호 화:디지털 서명 과 디지털 인증서
  • Android 보안 암호 화:Https 프로 그래 밍
  • 이상 에서 모든 내용 을 배 웠 고 대칭 암호 화,비대 칭 암호 화,메시지 요약,디지털 서명 등 지식 은 디지털 인증서 의 작업 원 리 를 이해 하기 위해 예비 지식 으로 삼 았 다.디지털 인증 서 는 암호학 에서 의 궁극 적 인 무기 로 인류 수천 년 의 역 사 를 총 결 한 지혜 의 결정 이다.디지털 인증서 의 작업 원 리 를 이해 한 후에 야 Https 협의의 안전 통신 체 제 를 이해 할 수 있다.결국 SSL 개발 과정 에서 뜻 대로 될 수 있 었 다.
    또한 대칭 암호 화 와 메시지 요약 이라는 두 가지 지식 포 인 트 는 단독으로 사용 할 수 있다.
    지식 점 직렬 연결:
    디지털 인증 서 는 위 에서 배 운 모든 지식 을 사 용 했 습 니 다.
  • 대칭 암호 화 와 비대 칭 암호 화 를 결합 하여 비밀 키 교환 을 실현 한 후에 통신 쌍방 은 이 비밀 키 를 사용 하여 대칭 암호 화 통신 을 한다.
  • 메시지 요약 과 비대 칭 암호 화 는 디지털 서명 을 실 현 했 고 루트 인증서 기 구 는 대상 인증서 에 서명 을 했 으 며 검증 할 때 루트 인증 서 는 공개 키 로 이 를 검증 했다.검사 에 성공 하면 이 인증 서 는 신뢰 를 받 는 것 입 니 다.
  • Keytool 도 구 는 인증 서 를 만 들 수 있 으 며,이후 루트 인증서 기관 에 인증 후 직접 서명 인증 서 를 사용 하고 인증서 의 RFC 형식 정보 등 을 출력 할 수 있다.
  • 디지털 서명 기술 은 신분 인증 과 데이터 완전 성 보증 을 실현 했다.
  • 암호 화 기술 은 데이터 의 기밀 성 을 확보 하고 메시지 요약 알고리즘 은 데이터 의 완전 성 을 확보 하 며 대칭 암호 화의 효율 은 데이터 처리 의 신뢰성 을 확보 하고 디지털 서명 기술 은 작업 의 부인 할 수 없 는 성 을 확보한다.
  • 상기 내용 의 학습 을 통 해 우 리 는 다음 과 같은 지식 을 습득 할 수 있어 야 한다.
  • 기초 지식:bit 비트,바이트,문자,문자 인 코딩,진 변환,io
  • 실제 개발 에서 대칭 암호 화 를 어떻게 사용 하 는 지 알 고 문 제 를 해결 하 는 방법
  • 대칭 암호 화,비대 칭 암호 화,메시지 요약,디지털 서명,디지털 인증서 가 어떤 문 제 를 해결 하기 위해 발생 하 는 지 알 고 있 는
  • SSL 통신 프로 세 스 파악
  • 실제 개발 에서 Https 인 터 페 이 스 를 어떻게 요청 합 니까?
  • 개술
    SSL(Secure Sockets Layer 안전장치 연결 층)은 네트워크 회사(Netscape)가 개발 하여 인터넷 에서 데이터 전송 의 안전 을 보장 하고 데이터 암호 화(Encryption)기술 을 이용 하여 데이터 가 네트워크 에서 전송 되 는 과정 에서 차단 되 거나 도청 되 지 않도록 확보 할 수 있다.일반적으로 통용 되 는 규격 은 40 bit 의 안전 기준 이 고 미국 은 128 bit 의 더 높 은 안전 기준 을 내 놓 았 으 나 출국 을 제한 했다.3.0 버 전 이상 의 I.E.나 Netscape 브 라 우 저 만 있 으 면 SSL 을 지원 할 수 있 습 니 다.
    TLS(Transport Layer Security 전송 층 보안)는 두 통신 응용 프로그램 간 에 보안 성과 데이터 완전 성 을 제공 하 는 데 사용 된다.TLS 는 SSL 의 표준 화 된 결과 물 로 1.0,1.1,1.2 세 가지 버 전이 있 으 며 기본적으로 1.0 을 사용한다.TLS 1.0 이랑 SSL 3.0 이 거의 없어 요.
    차이 가 있 습 니 다.사실 우 리 는 지금 TLS 를 사용 하고 있 지만 역사적 으로 SSL 이라는 호칭 에 익숙 해 졌 기 때 문 입 니 다.
    SSL 통신 간단 한 그림:

    SSL 통신 상세 설명:

    자체 서명 인증서 의 사이트 데 이 터 를 사용 하 기 를 요청 할 때 예 를 들 어 12306 의 여객 운송 서비스 페이지:https://kyfw.12306.cn/otn/ 을 요청 하면 다음 과 같은 오 류 를 보고 합 니 다.클 라 이언 트 의 루트 인증 기구 가 이 인증서 의 오류 정 보 를 식별 하지 못 하기 때 문 입 니 다.unable to find valid certification path to required target
    해결 방안
    하나의 인증 서 를 믿 을 수 있 는 지 없 는 지 는 TrustManager 에 의 해 결정 되 기 때문에 아무것도 하지 않 는 TrustManager 만 사용자 정의 하면 됩 니 다.서버 에서 제시 한 모든 인증 서 는 검사 하지 않 고 일률적으로 실행 합 니 다.
    
    public static void main(String[] args) throws Exception {
    //       TLS(transport layer secure)
    SSLContext sslContext = SSLContext.getInstance("TLS");
    //       (TrustManager           )
    TrustManager[] tm = new TrustManager[]{new EmptyX509TrustManager()};
    //              SSL      
    sslContext.init(null, tm, null);
    //     SSLSocketFactory   (   ssl        )
    HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
    
     //URL url = new URL("https://www.baidu.com");
     URL url = new URL("https://kyfw.12306.cn/otn/");
     HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
     InputStream in = conn.getInputStream();
     System.out.println(Util.inputstream2String(in));
     }
    
     /**
     *                 ,         ,    
     */
     private static class EmptyX509TrustManager implements X509TrustManager{
     @Override
     public void checkClientTrusted(X509Certificate[] chain, String authType)
     throws CertificateException {
     }
    
     @Override
     public void checkServerTrusted(X509Certificate[] chain, String authType)
     throws CertificateException {
     }
    
     @Override
     public X509Certificate[] getAcceptedIssuers() {
     return null;
     }
    }
    
    
    해결 방안
    12306 서버 에서 제시 한 인증 서 는 중 철 그룹 SRCA 가 그 에 게 발급 한 것 이기 때문에 SRCA 의 인증 서 는 12306 인증 서 를 식별 할 수 있 기 때문에 SRCA 인증 서 를 시스템 의 KeyStore 에 가 져 온 다음 에 TrustManager Factory 에 초기 화하 면 SRCA 를 루트 인증서 인증 기구 에 추가 하고 나중에 검사 할 때SRCA 는 12306 인증 서 를 검사 할 때 인증 을 통과 할 수 있 습 니 다.
    이러한 솔 루 션 은 두 가지 사용 방식 이 있다.하 나 는 SRCA.cer 파일 을 직접 사용 하 는 것 이 고,다른 하 나 는 파일 을 바 꾼 RFC 형식 데 이 터 를 사용 하여 코드 에 쓰 는 것 이다.
    
    //12306    RFC   (              )
     private static final String CERT_12306_RFC = "-----BEGIN CERTIFICATE-----
    "+ "MIICmjCCAgOgAwIBAgIIbyZr5/jKH6QwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ04xKTAn"+ "BgNVBAoTIFNpbm9yYWlsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRTUkNBMB4X"+ "DTA5MDUyNTA2NTYwMFoXDTI5MDUyMDA2NTYwMFowRzELMAkGA1UEBhMCQ04xKTAnBgNVBAoTIFNp"+ "bm9yYWlsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRTUkNBMIGfMA0GCSqGSIb3"+ "DQEBAQUAA4GNADCBiQKBgQDMpbNeb34p0GvLkZ6t72/OOba4mX2K/eZRWFfnuk8e5jKDH+9BgCb2"+ "9bSotqPqTbxXWPxIOz8EjyUO3bfR5pQ8ovNTOlks2rS5BdMhoi4sUjCKi5ELiqtyww/XgY5iFqv6"+ "D4Pw9QvOUcdRVSbPWo1DwMmH75It6pk/rARIFHEjWwIDAQABo4GOMIGLMB8GA1UdIwQYMBaAFHle"+ "tne34lKDQ+3HUYhMY4UsAENYMAwGA1UdEwQFMAMBAf8wLgYDVR0fBCcwJTAjoCGgH4YdaHR0cDov"+ "LzE5Mi4xNjguOS4xNDkvY3JsMS5jcmwwCwYDVR0PBAQDAgH+MB0GA1UdDgQWBBR5XrZ3t+JSg0Pt"+ "x1GITGOFLABDWDANBgkqhkiG9w0BAQUFAAOBgQDGrAm2U/of1LbOnG2bnnQtgcVaBXiVJF8LKPaV"+ "23XQ96HU8xfgSZMJS6U00WHAI7zp0q208RSUft9wDq9ee///VOhzR6Tebg9QfyPSohkBrhXQenvQ"+ "og555S+C3eJAAVeNCTeMS3N/M5hzBRJAoffn3qoYdAO1Q8bTguOi+2849A=="+ "-----END CERTIFICATE-----
    "; public static void main(String[] args) throws Exception { // TLS(transport layer secure) SSLContext sslContext = SSLContext.getInstance("TLS"); // SRCA.cer //FileInputStream certInputStream = new FileInputStream(new File("srca.cer")); // RFC ByteArrayInputStream certInputStream = new ByteArrayInputStream(CERT_12306_RFC.getBytes()); // keyStore, KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); // null keystore, keystore( srca.cer keystore ) keyStore.load(null); // Certificate certificate = CertificateFactory.getInstance("X.509") .generateCertificate(certInputStream); // srca.cer KeyStore , srca keyStore.setCertificateEntry("srca", certificate); // keyStore TrustManagerFactory trustManagerFactory = TrustManagerFactory .getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(keyStore); // TrustManager ssl , sslContext.init(null, trustManagerFactory.getTrustManagers(), null); HttpsURLConnection.setDefaultSSLSocketFactory(sslContext .getSocketFactory()); URL url = new URL("https://kyfw.12306.cn/otn/"); HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); InputStream in = conn.getInputStream(); System.out.println(Util.inputstream2String(in)); }
    Android 의 https 요청:
    scra.cer 파일 을 assets 나 raw 디 렉 터 리 에 시험 하거나 인증서 의 RFC 형식 을 직접 사용 합 니 다.다음 방법 은 자바 프로젝트 코드 와 같 습 니 다.
    
    //ByteArrayInputStream in = new ByteArrayInputStream("rfc".getBytes());
    CertificateFactory cf = CertificateFactory.getInstance("X.509");
    InputStream caInput = new BufferedInputStream(new FileInputStream("load-der.crt"));
    Certificate ca;
    try {
     ca = cf.generateCertificate(caInput);
     System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
    } finally {
     caInput.close();
    }
    String keyStoreType = KeyStore.getDefaultType();
    KeyStore keyStore = KeyStore.getInstance(keyStoreType);
    keyStore.load(null, null);
    keyStore.setCertificateEntry("ca", ca);
    
    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
    tmf.init(keyStore);
    
    SSLContext context = SSLContext.getInstance("TLS");
    context.init(null, tmf.getTrustManagers(), null);
    
    URL url = new URL("https://certs.cac.washington.edu/CAtest/");
    HttpsURLConnection urlConnection =
     (HttpsURLConnection)url.openConnection();
    urlConnection.setSSLSocketFactory(context.getSocketFactory());
    InputStream in = urlConnection.getInputStream();
    copyInputStreamToOutputStream(in, System.out);
    
    
    양 방향 인증서 검증
    
    CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    keyStore.load(null);
    
    SSLContext sslContext = SSLContext.getInstance("TLS");
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.
     getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init(keyStore);
    
    //   keystore
    KeyStore clientKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    clientKeyStore.load(getAssets().open("client.bks"), "123456".toCharArray());
    
    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    keyManagerFactory.init(clientKeyStore, "123456".toCharArray());
    
    sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());
    
    
    Nogotofail
    네트워크 트 래 픽 보안 테스트 도구,Google 의 오픈 소스 항목:https://github.com/google/nogotofail

    좋은 웹페이지 즐겨찾기