일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 알게뭐냐
- 개미수열
- 알고리즘
- Kotlin
- 랜선아미안해
- 워드프레스
- cross parameter
- kotliln
- 스프링
- brotli
- cache-control
- 클래스레벨밸리데이션
- 지뢰찾기
- LastModified
- etag
- Spring
- i18n
- 코드스피츠
- HTTP
- jsr303
- 브로틀리
- 이렇게살아야되나자괴감이
- 지수반등
- jsr380
- 리얼월드HTTP
- Today
- Total
취미개발 블로그와 마음수양
Spring의 Encryptors 문서 둘러보기. 본문
에.. 스프링 소셜을 하는데, 암호화를 좀 더 할 일이 생겼다. 음 그러니까... 왜 필요하게됐냐면... 말이 길다 소스를 잠깐 보자.
지금같은 화면인데 스프링의 JavaConfig 에서는 소셜설정을 위해 SocialConfigurer 인터페이스를 구현해서 사용한다.
SocialConfigurer 에서 오버라이딩하는 메소드 중에 getuserConnectironRepository 가 있다.
스프링소셜에서도 데이터베이스에 접근을 해야 되기 때문에 유저커넥션 레파지토리를 얻어야 하는데 여기에 getUserConnectironRepository 가 쓰인다.
여기서 리턴값으로 JdbcUsersConnectionRepository 라는 클래스를 쓰는 것같다.
이 JdbcUserConnectionRepository 는 세개의 파라미터를 받는다.
첫번째는 데이터소스, 두번째는 코넥션팩토리 로케이터 . (이건 고대로 쓰면 되고)
세번째가 org.springframework.security.crypto.encrypt.TextEncryptor textEncryptor 인데 textEncryptor 를 리턴하는 것은
Encryptors 에서 정적 메소드를 불러서 textEncryptor 를 리턴하는 구조다.
튜토리얼에서는 noOpText() 라고 되어있고, Encryptors.noOpText() 는 소셜정보를 평문으로 데이터베이스에 저장한다.
이렇기 때문에 튜토리얼에서는 쓰지 말라고 했던 것같다.
그래도 내가 하는 서비스에 저장되는 사람들 정보인데 암호화를 시켜줘야한다.
자바Doc 을 찾아보았다.
Class Encryptors
- java.lang.Object
- org.springframework.security.crypto.encrypt.Encryptors
public class Encryptors extends Object
- 보통 사용되는 암호생성기를 위한 팩토리. TextEncryptor 구현이나 BytesEncryptor 를 생성함으로써 공공API 를 정의한다.
Method Summary
Modifier and Type Method and Description static TextEncryptor
noOpText()
어떠한 암호화도 하지 않는 본문암호생성기를만든다.Creates a text encryptor that performs no encryption.static TextEncryptor
queryableText(CharSequence password, CharSequence salt)
표준 비밀번호기반암호화를 이용하여서 쿼리가능한 문자열을 위한 암호생성기를 만든다.Creates an encryptor for queryable text strings that uses standard password-based encryption.static BytesEncryptor
standard(CharSequence password, CharSequence salt)
256 bit의 AES 암호화를 이용하여서 표준 비밀번호기반의 bytes 암호생성기를 만든다.Creates a standard password-based bytes encryptor using 256 bit AES encryption.static TextEncryptor
text(CharSequence password, CharSequence salt)
표준 비밀번호기반 암호생성기를 통해 글자암호생성기를 만든다.Creates a text encryptor that uses standard password-based encryption.
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 sharedsalt
- 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 sharedsalt
- 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://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
'FrameWork_ETC > Spring' 카테고리의 다른 글
BeanFactory 와 ApplicationContext (0) | 2015.11.15 |
---|---|
Google App engine 스프링 + JPA 연동 (앱엔진 스프링 JPA) (2) | 2014.12.15 |
스프링 회원가입 페이스북 로그인 (2) - 로그인 (0) | 2014.11.25 |
스프링 페이스북 회원가입 로그인 - (1) (0) | 2014.11.20 |
web.xml 스프링3입문 (0) | 2014.08.05 |