포럼
서버→클라이언트 암호화 애드온 개발 실패 ㅠㅠ
2014.04.10 23:34
클라이언트→서버로의 폼 암호화 애드온을 개발에 성공해서, 서버→클라이언트로의 암호화 전송 애드온을 만들려고 했습니다.
간단한 아이디어는 다음과 같습니다.
1. 서버에서는 addon에서 최종출력전($called_position == 'before_display_content) 에 본문 내용($output) 변수를 전부 가로채서 php상에서 자체적으로 gzip(deflate)후 AES로 encrypt합니다. 그리고 Base64로 인코딩한 뒤에 자바스크립트 변수로 클라이언트에 쏴줍니다. (php상에서 자체적으로 gzip하는 이유는 불필요하게 낭비되는 공간을 잡아주기 위함입니다. 약 70%정도의 공간을 잡아줄수 있더군요. 게다가 암호화 하는 양 자체가 줄어들어서 모바일에서 암호를 빠르게 풀기 위해서는 이 방법이 필수라고 생각합니다.)
2. 클라이언트에서는 document가 로딩되자 마자, javascript 변수로 받은 본문내용을 AES로 decrypt합니다. 그리고 다시 Gzip으로 풀어준뒤에 utf-8형태로 변환하여 복원해 줍니다. 그리고 자바스크립트로 복원한 내용을 <body>태그 또는 자체 커스텸 태그(<ENCRYPTED>) 안에 몽땅 다 집어넣습니다...
(키 교환 과정은 생략합니다. 궁금하시면 댓글달아주시면 설명해 드릴게요.)
그러나 결론적으로 보면 실패했네요. 일단 저렇게 하니 CSS가 하나도 먹히지 않더군요. 만약 저 방법을 쓰려면 CSS 도 같이 암호화 하여 전송해야 할것(이런걸 동적로딩이라고 하나요?) 같네요. 그렇게 하려면 애드온에서 이것저것 할게 많아질것 같습니다. 그리고 가장 큰 문제로는 파이어폭스하고, 사파리에서는 저렇게 하면 CSS가 깨지긴 해도 본문 내용이 나와주는데, 크롬이나 IE에서는 보안문제(내부 정책?) 때문인지, 화면이 하나도 나오지 않더군요. 소스보기를 하면 태그는 정상적으로 출력이 되는데 제가 실력이 부족한건지 브라우저 차원에서 막아둔것지 잘 모르겠더군요.
P.S
참고사항 모바일에서 충분히 자바스크립트로 encrypt/decrypt 부하가 과도하게 가지 않는지 체크를 해 보았는데, 큰 무리가 가지 않았습니다. 암호해독 성능이 우려되어서 RC4, AES, Rabbit등을 체크해 보았는데 , RC4와 AES256 둘다 쓸만하며, RC4가 AES256보다 두배 정도 빠르더군요. 그러나 AES128을 이용한다면 RC4랑 동등한 속도를 제공해 줄것으로 생각하기에, 이왕이면 보안이 강한 AES 을 이용하면 좋을것 같습니다. AES256이 2배 정도 느려도 워낙 빨라서 체감하기는 조금 힘들것 같습니다.
rabbit algorithm도 이용해 보았는데, 속도가 AES 256과 큰 차이가 없었습니다. 오차범위내로 rabbit이 조금 빨랐네요. 그냥 AES가 킹왕짱 인듯 합니다. 결론적으로는 gzip을 한다면, AES256을 이용하여도 모바일에서도 충분히 암호화를 풀어 낼 수 있었습니다.
참고한 library는
zlib 을 javascript로 구현한것
https://github.com/imaya/zlib.js
함수명 : UTF8ArrToStr
여기서 solution2 입니다. uint8, 배열(위 zlib에서 사용되더군요ㅡㅡ)을 utf8로 바꿔주는 디코더
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding