관리 메뉴

취미개발 블로그와 마음수양

Spring의 Encryptors 문서 둘러보기. 본문

FrameWork_ETC/Spring

Spring의 Encryptors 문서 둘러보기.

아라한사 2014. 12. 3. 17:37

에.. 스프링 소셜을 하는데, 암호화를 좀 더 할 일이 생겼다. 음 그러니까... 왜 필요하게됐냐면... 말이 길다 소스를 잠깐 보자.



지금같은 화면인데 스프링의 JavaConfig 에서는 소셜설정을 위해 SocialConfigurer 인터페이스를 구현해서 사용한다.
SocialConfigurer 에서 오버라이딩하는 메소드 중에 getuserConnectironRepository 가 있다.

스프링소셜에서도 데이터베이스에 접근을 해야 되기 때문에 유저커넥션 레파지토리를 얻어야 하는데 여기에 getUserConnectironRepository 가 쓰인다.

여기서 리턴값으로 JdbcUsersConnectionRepository 라는 클래스를 쓰는 것같다. 

이 JdbcUserConnectionRepository  는 세개의 파라미터를 받는다. 


첫번째는 데이터소스, 두번째는 코넥션팩토리 로케이터 . (이건 고대로 쓰면 되고)

세번째가 org.springframework.security.crypto.encrypt.TextEncryptor textEncryptor 인데 textEncryptor 를 리턴하는 것은 

Encryptors 에서 정적 메소드를 불러서 textEncryptor 를 리턴하는 구조다. 


튜토리얼에서는 noOpText() 라고 되어있고, Encryptors.noOpText() 는 소셜정보를 평문으로 데이터베이스에 저장한다. 

이렇기 때문에 튜토리얼에서는 쓰지 말라고 했던 것같다.

그래도 내가 하는 서비스에 저장되는 사람들 정보인데 암호화를 시켜줘야한다. 


자바Doc 을 찾아보았다.




org.springframework.security.crypto.encrypt

Class Encryptors



  • public class Encryptors extends Object

  • 보통 사용되는 암호생성기를 위한 팩토리. TextEncryptor 구현이나 BytesEncryptor 를 생성함으로써  공공API 를 정의한다. 
    • Method Detail

      • standard

        public static BytesEncryptor standard(CharSequence password,
                              CharSequence salt)
        Creates a standard password-based bytes encryptor using 256 bit AES encryption. Derives the secret key using PKCS #5's PBKDF2 (Password-Based Key Derivation Function #2). Salts the password to prevent dictionary attacks against the key. The provided salt is expected to be hex-encoded; it should be random and at least 8 bytes in length. Also applies a random 16 byte initialization vector to ensure each encrypted message will be unique. Requires Java 6.
        Parameters:
        password - the password used to generate the encryptor's secret key; should not be shared
        salt - a hex-encoded, random, site-global salt value to use to generate the key
      • text

        public static TextEncryptor text(CharSequence password,
                         CharSequence salt)
        Creates a text encryptor that uses standard password-based encryption. Encrypted text is hex-encoded.
        Parameters:
        password - the password used to generate the encryptor's secret key; should not be shared
      • queryableText

        public static TextEncryptor queryableText(CharSequence password,
                                  CharSequence salt)
        Creates an encryptor for queryable text strings that uses standard password-based encryption. Uses a 16-byte all-zero initialization vector so encrypting the same data results in the same encryption result. This is done to allow encrypted data to be queried against. Encrypted text is hex-encoded.
        Parameters:
        password - the password used to generate the encryptor's secret key; should not be shared
        salt - a hex-encoded, random, site-global salt value to use to generate the secret key
      • noOpText

        public static TextEncryptor noOpText()
        Creates a text encryptor that performs no encryption. Useful for developer testing environments where working with plain text strings is desired for simplicity.


뭐가 이리 길어-_- 번역을 굳이 해봤자 그냥 네개의 메소드만 있다는 것만 기억에 남는다. 

이름 그대로 메소드가 거의 구성되어있으므로.. 그냥 쓰자.


일단 암호화가 어떻게 되나 테스트를 해보자.





어떻게 암호화를 하나 보려고 했는데 암호화를 하면 에러가 난다. 왜 일까.

스프링 암호생성기에서는 AES 256 bit 방식을 쓴다는데, 자바에서는 128 bit 까지만 지원된다고 한다..

(이것때문에 몇십분 고생한것같다-_-...닝기링...)


여기를 참고해서 파일들을 덮어써야한다. (참고로 필자는 외국에서 구글링해서 이미 파일을 다운받아서 복사하려고 했는데, 프로그램파일스 폴더의 자바설정폴더 안에 파일에 이미 있길래.. "어라 이거 있는데? 하고서 받아놓기만 했지 붙여넣기를 하지 않았다" .. 삽질을 더 하게 됨...)

여기 참고 : http://dukeom.wordpress.com/2013/01/03/aes256-%EC%95%94%ED%98%B8%ED%99%94%EC%8B%9C-java-security-invalidkeyexception-illegal-key-size-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EC%95%88/


다운은 여기서 받자 : http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html

위 블로그에서 찾기가 좀 힘들어서 외국 스택오버플로우에서 받은 주소 다시 적다. 


알고보니 미통상법에 의해 자국내에서만 AES 256 이 된다고 한다 하하하하하;;;


아무튼 암호화가 제대로 설정되는 것을 보았으면, 이제 스프링 소셜설정을 다시 바꿔보자.

참고로 윗 테스트는 이런 결과가 나온다.




암호화가 되는 것을 확인했으니, 설정값을 바꿔주자.

암호화가 되니깐 안그래도 길던 액세스 토큰값이 길어진다. 

참고 * userconnectiron table 의 길이를 512 정도로 바꿔줘야한다.


소셜설정에서 이렇게 바꿔주면, 



여기서는 salt 란에 KeyGenerator 를 썼지만 실제 개발에서는 key 를 따로 저장해야 할 것이다. 왠지 저렇게 하면 매번 빌드때마다 salt 값이 바뀌는 건 아닌지 모르겠다.


데이터베이스 db 컬럼들이 이렇게 바꿔진다...액세스토큰이 암호화가 되면서 엄청 길어진다;; 음..






아 그리고 썼던 원래 글에서 


RegistrationController 에서 ProviderSignInUtils 로 소셜 회원 등록을 하는 것이 있는데

이 클래스의 static 메소드가 Deprecated 되었다. 그러니 ProviderSignInUtils 을 빈등록한다음에 객체를 주입받아서 

객체에서 메소드를 쓰면 될 것이다.


handlePostSignUp 메소드는 doHandle~ 로 시작하는 메소드로 바꿔주고,

getConnection 메소드는 getConnectionFromSession 메소드로 바꿔주면 된다.


deprecated 된 메소드는 왠지 꺼림직해서^^...


그럼이만.



참고 docs-

JDBCUserConnectionRepository

http://docs.spring.io/spring-social/docs/1.0.3.RELEASE/api/org/springframework/social/connect/jdbc/JdbcUsersConnectionRepository.html


SocialConfigurer

http://docs.spring.io/spring-social/docs/current/apidocs/org/springframework/social/config/annotation/SocialConfigurer.html


Encryptors

http://docs.spring.io/autorepo/docs/spring-security/3.2.0.RELEASE/apidocs/org/springframework/security/crypto/encrypt/Encryptors.html


TextEncryptors

http://docs.spring.io/autorepo/docs/spring-security/3.2.2.RELEASE/apidocs/org/springframework/security/crypto/encrypt/TextEncryptor.html


스프링 소셜 여기 블로그에 쓴 글 : http://adunhansa.tistory.com/192