2010-04-22 6 views
1

PHP 웹 서비스에 연결하는 Silverlight 앱이 있습니다. 나는 webservice와 Silverlight 클라이언트 사이의 통신을 암호화하고 싶다. 나는 SSL에 의존하지 않는다. 나는 AES 256bit Key와 IV를 사용하여 POST 문자열을 암호화/복호화하고있다.Silverlight 및 암호화, 키/iv 쌍을 저장/생성하는 방법?

큰 질문은 다음과 같습니다

  1. 가 어떻게 PHP에서 임의의 고유 키/정맥 쌍을 생성 않습니다.

  2. 안전한 방법으로 웹 서비스와 실버 라이트 클라이언트간에이 키/iv 쌍을 어떻게 공유합니까?

클라이언트에 하드 코딩 된 키 또는 iv가 없으면 불가능한 것처럼 보입니다. 어느 쪽이 보안을 해칠 것입니다.

이것은 공개 웹 사이트이므로 로그인 할 수 없습니다. 보안 통신의 요구 조건.

PHP 소스 코드에서 SHA256으로 타임 스탬프 솔트로 해시 된 다음 키 또는 IV로 할당 된 시드 (seed)를 하드 코딩 할 수 있습니다. 이는 서버에 있으므로 매우 안전합니다. 그러나 클라이언트에서 하드 코딩 된 경우 키/iv 쌍의 시드가 표시됩니다.

타임 스탬프를 예측할 수 있으므로 고유성/무작위성을위한 기준으로 타임 스탬프를 사용하는 것이 더 이상 확실하지 않습니다. 그러나 C# 코드와 PHP 코드 사이에는 공통된 요소가 있습니다.

내가 생각할 수있는 유일한 다른 옵션은 Silverlight 클라이언트뿐만 아니라 php webservice에 키/iv를 제공하는 제 3의 서비스를 포함하는 것입니다. Silverlight 클라이언트에서 키/iv 배포 서비스에 액세스하기위한 자격 증명을 저장하는 방법에 대한 질문과 함께이 과정을 새로 시작하십시오.

민감한 데이터는 웹 사이트의 관리 백엔드에서만 볼 수 있으므로 솔루션과 같은 사운드는 비대칭 암호화입니다. 안타깝게도 Silverlight에는 비대칭 암호화 클래스가 없습니다. 해결책? 내 자신의 Diffie-Hellman 키 교환 롤! 그 열쇠를 AES256에 꽂아 라!

답변

3

질문에 대한 답변은 "SSL"입니다.

대칭 암호화 은 비교적 작은 크기 (예 : 256 비트 키)의 공유 비밀을 기밀성과 무결성을 보장하는 보안 데이터 전송 터널로 확장합니다. 이것은 보이는 것처럼 쉬운 일은 아닙니다. 작지만 치명적인 내용이 많이 있습니다.

비대칭 암호화는 보안되지 않은 네트워크에서 공유 암호를 설정하는 것에 관한 것입니다. RSA 암호화, 디피 - 헬만 (Diffie-Hellman)은 알고리즘을 통해 도움을받을 수 있습니다. 여전히 어딘가에서 시작해야합니다. 즉, 서버의 공개 키 (해당 RSA 공개 키, Diffie-Hellman의 절반)을 사용하면 ...) 그렇다면 당신은 우체국 공개 키를 사용해야한다는 것을 알 수있는 방법이 있어야합니다. 통신을 가로막고 대신 자신의 키를 먹이는 나쁜 사람의 공개 키가 아닙니다. 주로 클라이언트 응용 프로그램 내에서 공용 키를 하드 코딩하는 방법, 서버 공개 키 또는 서명 (즉, 인증)에 사용할 수있는 키인 공개 키를 사용하는 방법이 있습니다. 물론 Silverlight를 사용하면 클라이언트 코드도 다운로드되므로 동일한 악의적 인 사람이 잠재적으로 조정할 수 있으므로 코드에 서명하고 브라우저에서 해당 서명을 확인하도록해야합니다.

이 모든 작업이 어렵고 많은 함정이 있습니다. SSL 프로토콜은이 모든 것을 통과했으며 참을성있게 그러나 고통스럽게 업데이트되고 수정되었습니다. 오랜 세월과 많은 영리한 사람들이 있었고 치아가 많이 분쇄되었습니다. 비슷한 프로토콜은 SSH입니다 (일부 인코딩 정보는 다르지만 원칙은 동일합니다). 자체 프로토콜을 설계하고 싶다면 SSL 및 SSH를 괴롭힌 대부분의 약점과 문제점을 재현 할 수있는 가능성이 있습니다. 단순히 SSL 또는 SSH를 사용하면 많은 시간과 문제를 줄일 수 있습니다.

+0

하지만 암호화 된 SSL 트래픽을 쉽게 볼 수 있다고 읽었습니까? – cmaduro

+0

RSA 암호화 된 DH 키를 사용할 수 있습니까? 좋은 해결책 인 것 같습니다. 누가 기본적으로 연결하려고하는지 신경 쓰지 않기 때문에, 나는 어떤 통신이 보내 졌든지간에 항상 변경되거나 도청되지 않았다고 항상 확신합니다. 이 경우 웹 서비스에 대한 각 요청이 고유 키를 생성하기 때문에 서버에서 요청한 정보가 자연스럽게 원래 요청자에게 돌아가고 다른 사람에게는 쓸모가 없습니다. – cmaduro

1

RSA와 같은 공용/개인 키 암호화 시스템을 사용할 수 있습니다. 클라이언트는 서버의 잘 알려진 공개 키를 사용하여 패킷을 암호화하고 암호화 된 데이터를 보내면 서버는 비밀 개인 키를 사용하여 암호를 해독합니다. 누구나 공개 키를 사용하여 암호화 된 서버 데이터를 보낼 수 있지만 서버 만 해독 할 수 있습니다. SSL처럼.

그러면 SSL을 사용하지 않는 이유는 무엇입니까?