맞는데 왜 틀릴까..?

Java/Secure Coding

[Secure Coding] 암호키를 Object.equals()로 비교하지 말라

안도일 2023. 9. 17. 17:08

Object가 기본적으로 제공하는 equals() 메서드는 모든 객체에 대해 메모리 주소로 비교한다

 

사실 지금까지 객체가 동일한지가 아닌 객체의 내용이 동일한지 판단할 때 equals를 사용했었기 때문에 잠깐 혼동이 왔었는데 내가 여태 사용했던 것은 Object.equals를 오버라이딩한 String.equals였다. 

 

오늘 아이템은 "Object.equals()로 비교하지 말자"이다. (메모리 주소로 비교하기 때문에)

 

 

📌 솔루션  

 

Object.equals만 사용하지 않고 여러 단계를 거쳐 검증하는 equals

 

 

해당 코드는 3단계로 이루어져 있다.

 

1. 두 Key가 동일한지 비교

2. 두 Key 객체의 인코딩 된 값 비교

3. 두 Key 모두 RSAPrivateKey 인스턴스라면 모듈러스와 개인 지수 비교

 

 

인코딩 된 값 비교

 

객체의 내용을 비교하려면 그냥 필드값만 비교하면 될 텐데 왜 인코딩 된 값을 비교해야 할까?

 

  • 만약 내용 비교가 가능하다면 인코딩할 필요는 없다.
  • 인코딩은 주로 내용 비교가 어려운 경우나 두 객체의 구조가 복잡하여 직접적인 내용 비교가 어려운 경우에 사용된다.

 

즉, 개인 키 객체가 암호키의 내용을 직접적으로 표현하고 있고, 그 내용을 비교할 수 있다면, 인코딩을 사용하지 않고 내용 비교만으로도 두 객체가 동일한 개인 키를 나타내는지를 확인할 수 있다.

 

 

RSAPrivateKey

 

RSAPrivateKey 인스턴스는 RSA (Rivest-Shamir-Adleman) 암호화 알고리즘을 사용하는 공개 키 암호화 시스템에서 개인키를 나타내는 인터페이스 또는 클래스다.

RSA 알고리즘은 공개 키와 개인 키를 사용하여 데이터를 암호화 및 복호화하는 데 사용되며, 개인 키는 중요한 정보를 포함한다.

 

 

RSAPrivateKey 인터페이스는 다음과 같은 주요 메서드를 포함한다.

 

  • getModulus() : RSA 알고리즘에서 사용되는 모듈러스 (N) 값을 반환한다. 모듈러스는 큰 소수인 두 소인수 (p, q)의 곱으로 이루어진 값으로, 암호화 및 복호화 연산에 사용된다.
  • getPrivateExponent() : RSA 알고리즘에서 사용되는 개인지수 (d) 값을 반환한다. 개인 지수는 암호화된 데이터를 복호화하기 위해 사용된다.

 

RSA 알고리즘에서는 N과 d를 포함한 개인 키가 공개되어서는 안 되며, 보안적으로 안전한 방식으로 보호되어야 한다.

RSAPrivateKey 인스턴스는 이러한 값들을 캡슐화하고 관리하는 데 사용된다.

 

Java의 java.security.interfaces.RSAPrivateKey 인터페이스를 구현한 클래스는 RSA 개인 키의 속성을 나타낸다. 이러한 개인 키를 사용하여 데이터를 암호화하고 복호화할 수 있다.