Не думаю, что это проблема.
Да, мифический «кто-то» может заменить реализацию MD5 чем-то небезопасным. Но для того, чтобы сделать это, мифологически кто-то должен иметь возможность вставить свой код в процесс Ruby. И если он может сделать это, то он, вероятно, мог бы также внедрить свой код в процесс Java и, например, переписать байт-код для операции MD5. Или просто перехватывать нажатия клавиш и вообще не беспокоиться о том, чтобы возиться с криптографическим кодом.
Одна из типичных проблем заключается в следующем: я пишу эту удивительную библиотеку, которая должна использоваться следующим образом:
require 'awesome'
# Do something awesome.
Но что, если кто-то использует это так:
require 'evil_cracker_lib_from_russian_pr0n_site'
# Overrides crypto functions and sends all data to mafia
require 'awesome'
# Now everything is insecure because awesome lib uses
# cracker lib instead of builtin
И простое решение: не делай этого! Обучите своих пользователей тому, что им не следует запускать ненадежный код, который они загружали из неизвестных источников, в свои критически важные приложения. И если они это сделают, они, вероятно, заслуживают этого.
Возвращаясь к вашему примеру с Java: это правда, что в Java вы можете сделать свой криптографический код private
и final
, а что нет. Однако кто-то может все же заменить вашу криптографическую реализацию! Фактически, кто-то действительно так и сделал: многие реализации Java с открытым исходным кодом используют OpenSSL для реализации своих криптографических процедур. И, как вы, наверное, знаете, в течение многих лет Debian поставлял неработающую небезопасную версию OpenSSL. Итак, все Java-программы, работавшие в Debian в течение последних двух лет, на самом деле выполняли с небезопасным шифрованием!