본문 바로가기

전체 글139

github action matrix strategy 활용 상황 설명 1. 우리 프로젝트는 PR 올리면 자동으로 테스트를 실행시키기 위해(CI 빌더로써) github action 을 활용한다. 2. 네이버망에 있는 서버와 API 통신을 할 때 Proxy 서버를 거쳐서 가도록 수정이 필요하다(보안 요구사항). WebClient 는 아래 코드와 같이 isSecurityProxyEnabled 가 true 인 경우(Proxy 서버를 거쳐가야 하는 경우), proxy 메서드를 통해 Proxy 서버 주소와 포트를 알려준다. @Value("${security-proxy.enabled:false}") private boolean isSecurityProxyEnabled; // true 이면, proxy서버를 거쳐야 한다 HttpClient httpClient = HttpCli.. 2022. 11. 13.
[논문분석] 블록체인 기반 분산 스토리지 시스템Storj Frameup 공격 및 대책 Storj 는 블록체인 기반 저장소 플랫폼이다. 해당 플랫폼을 공격하는 방법과 대책에 대한 논문을 분석하고 정리했다. 먼저 구글 드라이브 같은 전통적인 클라우드 저장소 플랫폼은 아래 왼쪽 그림과 같다. 기업 데이터센터에서 모든 파일들을 관리하고 클라우드 서비스를 제공한다. 하지만 Storj 는 업로드된 파일을 보관하는 역할도 일반 유저가 한다. 이런 역할을 수행하는 유저를 Farmer 라 부르는데, 개인 저장공간을 제공함으로써 보상으로 Storj 암호화폐 토큰을 얻을 수 있다. 반대로 Storj 암호화폐 토큰을 지불하고 서비스를 이용하는 유저를 Renter 라고 한다. 아래 오른쪽 그림을 보면 마치 Storj Bride 서버가 중앙집중식으로 모든걸 관리하는것처럼 보이지만, Renter 파일을 어느 Far.. 2022. 11. 12.
서명 생성과 검증 여기에서 설명했듯이 스칼라 곱셈이 공개키 암호 기법의 핵심이다. 비트코인에서는 secp256k1 타원곡선을 사용한다. 타원곡선은 $y^2 = x^3 + ax + b$ 인데 secp256k1 는 a=0, b=7 인 곡선이다. 유한체 위수(order) p 값(소수)은 `2**256 - 2**32 - 977` 다. 생성점 $G_x$ 값은 `0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798` 다. 생성점 $G_y$ 값은 `0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 ` 다 G(생성점) 의 유한순환군 위수 n 값은 `0xffffffffffffffffffffffffffff.. 2022. 10. 29.
타원곡선 위 점의 스칼라 곱셈 타원곡선위 한점을 계속 더하는것이다. 그리고 그 결과는 예측하기 어렵다. $ (170,142) + (170, 142) = 2 \cdot (170, 142) $ $ 2 \cdot (170, 142) + (170, 142) = 3 \cdot (170, 142) $ prime = 223 a = FieldElement(0, prime) b = FieldElement(7, prime) x1 = FieldElement(170, prime) y1 = FieldElement(142, prime) p = Point(x1, y1, a, b) print(p + p) 스칼라 곱셈의 또다른 특징이 있다. 어떤 점에 스칼라 값을 계속 증가시키면서 곱하다 보면 무한원점(덧셈에 대한 항등원. I) 에 도달한다. 그래서 만약 어떤 점.. 2022. 10. 29.
유한체에서 정의된 타원곡선 덧셈 유한체에서 정의된 타원곡선 유한체에서 정의되었기 때문에 타원곡선 모양이 실수체에서 정의된것과 많이 다르다. 유한체 원소들은 연속적이지 않기 때문이다. 유일하게 관찰되는 패턴은, $y^2$ 항 때문에 y 축의 중간값(100) 을 지나는 수평축을 기준으로 대칭이다. 실수체에서의 곡선처럼 x 축으로 대칭도 아니다. 유한체에서 음수가 없기 때문이다. # 연습문제 3.1 prime = 223 a = FieldElement(0, prime) b = FieldElement(7, prime) def on_curve(x, y): return y ** 2 == x ** 3 + a * x + b print(on_curve(FieldElement(192, prime), FieldElement(105, prime))) prin.. 2022. 10. 29.
타원곡선 덧셈 타원곡선 위의 점 덧셈 기본원리는 아래 그림과 같다. 덧셈에 대한 모든 케이스는 아래 세가지로 나눠서 따져봐야한다. 1. 두 점이 x 축에 수직인 직선 위에 있는 경우 p1 = Point(-1, -1, 5, 7) p2 = Point(-1, 1, 5, 7) inf = Point(None, None, 5, 7) print(p1 + inf == p1) print(p2 + inf == p2) print(p1 + p2 == inf) def __add__(self, other): # None 은 무한원점을 의미한다. self 가 무한원점이면, other 를 리턴. ex) A(other) + I(self) = A if self.x is None: return other # other.x 가 무한원점이면, self 를.. 2022. 10. 29.
신입 기술공부 멘토링 후기 회사 다닌지 꽤 됐지만 신입을 처음 멘토링해봤다. 이전팀에서는 계속 막내였고, 지금팀은 주니어들이 많지만 내가 멘토링할 위치는 아녔다. 최근에 신입사원 1명을 대상으로 기술공부 멘토링을 진행했다. 위에서 시키지도 않았는데 내가 자진해서 나섰다. 지금 생각해보면 기초 공부를 다시 하고 싶은 욕구가 컸던거 같다. 그래서 멘토링을 매개로 욕구를 충족 시켰다. 스터디는 짧고 굵게 하는것을 선호해서 HTTP 완벽가이드 2~3장, 토비 스프링 1~6장만 진행하기로 했다(총 6주). 신입사원이 책을 읽고 정리해서 나에게 발표하고, 나는 부족한 설명들을 채우고 도움이 될만한 이야기를 해주는 방식으로 진행했다. 나도 매주 책을 보면서 다시 공부했는데 여러번 봤던 내용들이지만 오랫만에 보니까 또 새로웠다. 어떤점이 새로웠.. 2022. 10. 26.
유한체 곱셈과 나눗셈 곱셈 유한체에서 닫혀 있는 덧셈 $+_f$ 을 정의했듯이 유한체에서 닫혀 있는 곱셈도 정의할 수 있다. 이를 이용하여 같은 숫자를 여러 번 곱하는 거듭제곱도 정의할 수 있다. 예를들어, 위수 19의 유한체 $F_{19}$ 에서 보면, $5 *_f 3$ = (5 * 3)%19 = 15 $8 *_f 17$ = (8 * 17)%19 = 3 곱셈 결과가 직관적이지 않다. 그러나 그 때문에 곱셈에 대해서 닫혀 있게 된다. 곱셈의 결과는 항상 집합 {0, 1, ...., p-1} 에 속하게 된다. 다시 말해 유한체 안에서 정의된 연산 결과는 항상 그 유한체 안에 속해야 한다. 그리고 유한체에서도 나머지 연산을 이용하여 거듭제곱 을 할 수 있다. $F_{19}$ 에서, $7^3$ = (7 * 7 * 7)%19 = 1.. 2022. 10. 24.
유한체 덧셈과 뺄셈 유한체에서의 덧셈을 정의할 때 그 결과가 여전히 유한체에 속해 있도록 해야 한다. 즉 수학 용어로 유한체에서 덧셈이 닫혀 있도록 해야 한다. 아래와 같이 19를 위수로 하는 유한체가 있다고 해보자. $F_{19} = {0, 1, 2, ... , 18}$ 여기에서 덧셈에 닫혀 있다는 뜻은 다음과 같다. $a +_f b \in F_{19}$ 일반 정수에서의 덧셈과 구별하기 위해 + 가 아닌 $+_f$ 로 표기한다. 나머지 연산을 사용하면 앞의 식이 항상 만족하는 것을 보장 할 수 있다. cf) 위수 p로 나머지 연산 $a +_f b$ = (a+b)%19 예를 들면, $7 +_f 8$ = (7+8)%19 = 15 $11 +_f 17$ = (11+17)%19 = 9 즉 우리만의 덧셈 연산을 만든거다. 뺏셈도 비.. 2022. 10. 13.
유한체 정의 1. 유한체 정의 수학에서 유한체(finite field) 는 아래 성질을 만족하는 2개의 연산자 (+ 덧셈, * 곱셈) 를 가진 집합이며 그 집합의 원소 수가 유한하다는 특징이 있다. 집합의 원소 갯수가 유한하기 때문에 집합 크기를 표현하는 p 값을 정할 수 있다. 이 값을 집합의 위수(order) 라고 한다. 1) a 와 b 가 집합에 속해 있으면, a+b 와 a*b 도 집합 안에 있다(집합 위에 두 연산 +, * 이 닫혀 있음). => 1번 성질로 집합은 덧셈과 곱셈에 대해 닫혀 있다. 그 의미는 덧셈과 곱셈 연산의 결과가 그 집합 안에 있도록 두 연산을 정의해야 한다는 뜻이다. 예를 들어 집합 {0, 1, 2} 는 덧셈에 대해 닫혀 있지 않다. 왜냐하면 1+2=3 이고 3 은 집합 안에 없기 때문.. 2022. 10. 13.
WebClient + Retry + CircuitBreaker WebClient 를 이용할 때, Retry 기능과 CircuitBreaker 기능을 추가할 수 있다. 구체적인 방법과 함께 테스트 코드는 어떻게 만드는지 알아보자. 먼저 전체 코드를 간단히 훑어보고 뒤에서 자세히 설명하겠다. 응답 status code 가 501 이상이면, CircuitBreakerException 을 만들어서 넘긴다. 하지만 timeout 에러면 0.5초 간격으로 1번 retry 를 수행한다. retry 를 수행해도 에러가 발생하면 RetryExhaustedException 으로 감싸져서 나오기 때문에 onErrorMap 으로 잡아서 cause 를 빼내 뒤로 전달한다. .exchangeToMono(clientResponse -> { if (clientResponse.rawStatusC.. 2022. 9. 24.
WebClient 사용할때 주의 (8편) 1. WebClient config 기본 구조 설명 WebClient 를 사용하기 위해선 WebClientBuilder 를 활용해 만드는데 clientConnector 인자로 ReactorClientHttpConnector 객체를 생성해 넣어준다. return webClientBuilder.baseUrl(apiClientProperties.getUrl()) .clientConnector( // ReactorClientHttpConnector 를 넣어줘야함 ) .build(); cf) ReactorClientHttpConnector 객체를 생성하기 위해선 reactorResourceFactory 가 필요한데, 따로 빈 등록해야한다. 물론 없어도 객체 생성이 가능하지만 내가 만든 코드에서는 필요했다. @Be.. 2022. 9. 18.