как сравнить сертификаты x509 с помощью бинарного поиска - PullRequest
0 голосов
/ 12 февраля 2012

У меня есть список, и в этом списке есть x509certificate, который я использую для хранения в пакете cms.Все прекрасно, пока я не наткнулся на проблему: у меня не может быть одного и того же человека, подписывающего дважды.
Итак, я знаю, как найти этот сертификат с помощью равных, так что линейный поиск.

Это может показаться чистым тщеславием, но я бы предпочел использовать бинарный поиск , используя, очевидно, comparable.
Как на небесах я могу это сделатьтот?( java или bouncyCastle ).

Спасибо

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Я хочу поблагодарить Jens и dnault за подсказку:
Я собираюсь сортировать и искать сертификаты, используя (bigInteger) SerialNumber, который всеесть сертификаты для сравнения, и как только я найду аналогичный серийный номер, я собираюсь сравнить их в кодированном формате DER .

Почему я не использовал подход с хэш-кодом, выможет спросить:
Не все сертификаты и подписи будут в памяти.Некоторые из них иногда находятся в файле PKCS7 (CMS) или в файле XMLDSig.Таким образом, хеш-код объекта может отличаться, так как физически это разные объекты, но логически они ссылаются на один и тот же сертификат.

Переопределение getHashCode даст только половину ответа, так как иногда не слишком часто серийный номер может встречаться дважды, поскольку это зависит от цепочки, к которой он принадлежит, среди других факторов.

Спасибо за информацию и помощь.

2 голосов
/ 12 февраля 2012

Храните сертификаты в TreeSet и используйте Collections.binarySearch, чтобы найти интересующий сертификат (сначала вам нужно превратить Set в List). В основе TreeSet лежит TreeMap, поэтому, если вам не нравится эта реализация, вы можете реализовать SortedSet и создать свою собственную. Если дубликаты сертификатов не являются проблемой, сохраните их в List и отсортируйте их перед вызовом binarySearch.

Есть ли причина, по которой вы не хотите использовать доброе старое Collection.contains?

...