Android 보안 암호 화:Https 프로 그래 밍 상세 설명
10489 단어 Android보안 암호 화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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.