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 개인 키의 속성을 나타낸다. 이러한 개인 키를 사용하여 데이터를 암호화하고 복호화할 수 있다.
'Java > Secure Coding' 카테고리의 다른 글
[Secure Coding] 안전하지 않거나 약한 암호 알고리즘을 사용하지 말라 (0) | 2023.09.23 |
---|---|
[Secure Coding] 비신뢰-메서드의 매개변수를 clone() 메서드로 복제하지 말라 (0) | 2023.09.12 |
[Secure Coding] LDAP 인젝션을 방지하라 (0) | 2023.09.09 |
[Secure Coding] XPath 인젝션을 방지하라 (0) | 2023.09.07 |
[Secure Coding] 코드 인젝션을 방지하라 (0) | 2023.09.02 |