마사키군
782
2015-10-05 09:39:21
8
7841

js단에서 암호화 후 서버단에서 복호화, 어떻게 해야 할지 감이 전혀 오질 않습니다


안녕하세요, 저번에도 비슷한 질문을 올렸지만-_- 여전히 감이 잡히질 않아서 재차 질문 올려봅니다. 관련 경험이 있으신 분들의 도움을 부탁드립니다.

브라우저의 폼에 입력한 데이터 전체를 암호화해서 서버로 전송, 서버측에서 복호화해서 처리하려고 합니다(js단에서의 암호화는 크게 의미가 없다는 점에 대해서는 여기서는 논외로 해 주셨으면 합니다).

js단에서의 암호화는 Crypto-JS https://code.google.com/p/crypto-js/ 를 이용하였습니다. 암호화 자체는 간단하더군요. 암호화 알고리즘에 해당하는 객체를 이용해서 encrypt/decrypt 메소드를 실행해주면 각각 encrypt 객체/decrypt 객체가 나오는 식이었습니다.

복호화는 js에서 하지 않을 예정이니 decrypt 객체는 필요가 없고, encrypt 객체를 살펴보니 별의별 속성이 다 있던데-_- 구글링을 통해서, 그 중 ciphertext가 암호문이라는 것까지는 알게 되었습니다. 또, 속성중에 key라는 것이 있었기 때문에 아마도 이것이 키가 아닌가 생각하고 있습니다.

그런데 처음에 암호화할때는 분명 키를 "this_is_the_key"라고 주었는데, encrypt.key를 출력해보니 "e6f9dbaf3ae964e9ebdfdabc0775661079fe91891fc8fb9373a4d0125610ad76"라고 표시가 되더군요(참, 암호화 알고리즘은 AES를 사용했습니다). 이게 왜 이렇게 출력되는지 이해가 되질 않습니다.

서버단에서는 구글링해서 나온 Java Symmetric AES Encryption Decryption using JCE http://javapapers.com/java/java-symmetric-aes-encryption-decryption-using-jce/ 문서를 그대로 복사해서 사용했습니다. 다만 이 코드에서는 키를 서버에서 자동 생성해서 사용하기 때문에, 아래 코드를 이용해서 키를 직접 생성해서 사용하려 했습니다.

String sKey = "this_is_the_key";

byte[] keyData = sKey.getBytes();
SecretKey key = new SecretKeySpec(keyData, 0, keyData.length, "AES");



그랬더니 Invalid AES key length라는 메시지와 함께 InvalidKeyException 예외가 발생하더군요. 이 예외는 위 js단의 encrypt 객체의 key 속성을 그대로 써도 동일했습니다.

이쯤되면 뭐가 뭔지 하나도 모르겠네요. crypto-js에서 key 속성으로 출력된 것은 무엇인지, crypto-js 페이지에 보니까 iv와 salt에 대해서도 설명이 있던데 iv나 salt도 복호화에 필요한 것인지, 왜 자바 코드에서는 어떤 문자열을 입력해도 모두 invalid key 예외가 발생하는 것인지...

혹시 관련 경험이 있으신 분의 조언을 구합니다 ㅠ_ㅠ

0
0
  • 답변 8

  • libedi
    597
    2015-10-05 10:29:25

    일단은 AES, public key를 사용하는 대칭키 알고리즘, 초기화 벡터(IV), 암호화 salt 등을 검색하시어

    해당 지식을 배우시고 코딩하시면 더 좋을 것 같습니다.


    아래 주소는 제가 잉여일 때 (;;;) , 여기저기 참고해서 한번 만들어본 AES 암호화 유틸 클래스 입니다.

    혹시 참고가 되실까 해서 올려드립니다.

    만든지 오래되서 모든 개념이 쓰이진 않았지만, 참고정도 하시는데는 도움이 되실 것 같습니다.

    (허접소스이므로 태클금지...ㅋㅋㅋ)


    https://github.com/libedi/test-spring-jquery/blob/master/testproject1/src/util/AESUtil.java

    0
  • 수평선
    960
    2015-10-05 10:30:32

    http://egloos.zum.com/kwon37xi/v/4427199

    이글이 도움이 되었으면 좋겠습니다.

    1
  • 혁이군
    71
    2015-10-05 12:04:21

    "this_is_the_key" 같은건 블록암호의 키로 바로 사용할 수 없습니다.

    블록 암호는 각 알고리즘에서 지정된 사이즈의 키를 써야하구요.

    더 자세한건 블록암호로 검색해서 공부하시면 되겠습니다.


    Crypto-js에서 키와 IV를 수동으로 지정하는 방법은

    https://code.google.com/p/crypto-js/#Custom_Key_and_IV

    문서를 보시기바랍니다.


    블록암호 알고리즘 - 블록암호 모드 - 키 - IV(필요한 경우) 가 일치하면 복호화 됩니다.

    -1
  • narise
    2k
    2015-10-05 13:05:17

    브라우저 자바스크립으로 암호화 해봤자, 개발툴로 디버깅하면 다 보이고, 바로 털리는거 아닌가요?


    어떤목적인지는 모르겠지만 SSL증명서 대신 사용하고 개인정보라면, 법률에도 걸릴 것같은데...




    제6조(개인정보의 암호화)

    ③ 정보통신서비스 제공자등은 정보통신망을 통해 이용자의 개인정보 및 인증정보를 송·수신할 때에는 안전한 보안서버 구축 등의 조치를 통해 이를 암호화해야 한다. 보안서버는 다음 각 호 중 하나의 기능을 갖추어야 한다.

    1. 웹서버에 SSL(Secure Socket Layer) 인증서를 설치하여 전송하는 정보를 암호화하여 송·수신하는 기능

    2. 웹서버에 암호화 응용프로그램을 설치하여 전송하는 정보를 암호화하여 송·수신하는 기능


    0
  • 마사키군
    782
    2015-10-05 13:18:00

    @libedi, @혁이군 //
    암호화에 대해서 코딩에 직접 사용할 수 있을 정도는 알고 있다고 생각했는데, 전 하나도 모르는 상태였군요-_-;
    일단, 우연히 관련 코드 예제를 구했기 때문에 이걸 기준으로 적용할까 생각중이고, 추후 모자란 부분에 대한 공부를 더 해봐야겠네요;
    신경써 주셔서 고맙습니다.

    @수평선 //
    해당 문서의 내용은 지금 제가 처한 상황과는 조금 처지가 다른것 같습니다. 힘들게 찾아주셨는데, 제가 지금 사용하기는 힘들겠네요^^;;
    제 질문에 관심가져주셔서 고맙습니다.

    @narise //
    본문에도 적었듯이, 자바스크립트로 암호화를 한다는 행위가 크게 의미가 없다는 사실은 저도 알고 있습니다.
    암호화의 목적이 송수신간 데이터 보호가 아니었으며, 전송하는 데이터도 개인정보와는 관련없는 데이터였기 때문에 굳이 서버에 SSL을 구축하지 않은 것입니다.

    0
  • 앙앙이
    2015-10-05 14:46:26

    //narise

    html session storage에  비밀키를 넣어도

    툴로 쉽게 뚫리나요.

    어떤 툴인지 알고 싶습니다


    ㅡㅡㅡㅡㅡ

    //마사키군

    저두  암호화  모듈 구현해습니다

    www.sinnori.pe.kr 에 실행해 보실수  있구요

    소스도 사이트에서 소개한 github 주소 통해 얻으실수  있습니다.

    단 개인 프로젝트 전체 소스라 음

    kr.pe.sinnori.common.sessionkey 패키지에 있는 소스들만 참고하시면 됩니다

    0
  • 마사키군
    782
    2015-10-05 15:04:22

    @앙앙이 //
    헉, 개인 프로젝트... 고맙습니다. 지금은 살펴볼 틈이 없는데, 꼭 살펴보고 공부하도록 하겠습니다(?).
    쓸데없는 오지랖일지도 모르지만, narise님의 말씀의 의미는 이런 의미일 겁니다. 대칭키 암호화를 하는 이상 어떻게든 키를 클라이언트나 서버로 전송할 수밖에 없을텐데, 그러면 조금이라도 js 관련한 지식이 있는 유저라면 브라우저의 개발자 도구를 이용한 js breakpoint 등을 이용해서, 비밀키를 받는 직후나 이후에 암호화를 하려고 하는 직전에 키를 알 수 있게 된다는 의미일 겁니다.

    0
  • 앙앙이
    2015-10-05 16:57:29

    //마사키군

    Html5 session storage 에 비밀키를 넣으면

    해당 웹 페이지 소스  봐도

    비밀키는 모릅게 됩니다.

    어떤 툴이기에  이런 방법을 뚫고

    비밀번호를 채 갈수 있는지 해서요

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.