Przeprowadzanie manipulacji kodami bajtowymi za pomocą interfejsów API takich jak javaassist modyfikuje pliki klas po kompilacji. Ale jeśli kod Java jest zoptymalizowany, czy modyfikacje nie mogą być wykonane w niewłaściwym miejscu? Czy istnieją sposoby na uniknięcie tego problemu? Czy historia różni się między zwykłą Javą a Androidem?Szyfrowanie kodu bajtowego jest bezpieczne
Odpowiedz
Typowy program Java jest kompilowany wiele razy. W pierwszym kroku kod źródłowy Java jest tłumaczony na kod Java o kodzie. W drugim kroku kod bajtowy Java jest tłumaczony na kod maszynowy o kodzie.
Szczegóły tego procesu zależą oczywiście od maszyny wirtualnej, która uruchamia kod. Wcześniejsze wersje Javy nie zawierały na przykład tak zwanego kompilatora just-in-time. W tym przypadku kod bajtowy został zinterpretowany jako instrukcja, gdzie manipulacje kodami bajtowymi mogą oczywiście mieć wpływ na wydajność. Ale to nie jest prawda. Zarówno maszyna wirtualna OpenJDK HotSpot, jak i środowisko wykonawcze z Androidem ART i DEX dokonują optymalizacji kodu bajtowego.
Kompilator javac, który tłumaczy kod źródłowy na kod bajtowy, wykonuje bardzo niewiele optymalizacji. Normalnie nie powinieneś martwić się o wpływ translacji na kod bajtowy. Jednak w niektórych przypadkach kod bajtowy wygenerowany przez generowanie kodu runtime może mieć wpływ na wydajność. Dzieje się tak, gdy kompilator just-in-time obserwuje kod bajtowy, który jest trudny do zoptymalizowania. Zazwyczaj jest to spowodowane niepotrzebnymi alokacjami obiektów, które trudno jest zoptymalizować.
Jeśli chcesz wyglądać w szczegółach tej sprawy, dałem tę prezentację gdzie mogę porozmawiać trochę o tym problemie: https://www.youtube.com/watch?v=XMY6HA7_h5Y
chodzi o bezpieczeństwo: Dopóki manipulacji kodu bajtowego nie uszkodzić bajtowy kod, nie ma problemu. Jeśli zepsuje kod bajtowy, wirtualna maszyna języka Java odmówi załadowania klasy z uszkodzonym kodem. Dotyczy to zarówno HotSpot, jak i Androida, które sprawdzają kod bajtowy poprzedzający załadowanie klasy.
- 1. Czy to szyfrowanie AES jest wystarczająco bezpieczne?
- 2. Autonomiczny weryfikator kodu bajtowego
- 3. Wizualizator kodu bajtowego Java
- 4. CPython to interpreter kodu bajtowego?
- 5. Dekompilowanie plików kodu bajtowego OCaml
- 6. Bezpieczne szyfrowanie keypair w Delphi i PHP?
- 7. Analiza kodu bajtowego w Javie
- 8. Obfuscowanie kodu bajtowego python poprzez mutację interpretera
- 9. Czy możliwe jest przeglądanie plików klasy Java według kodu bajtowego
- 10. Wyświetlanie wygenerowane przez bajt kodu bajtowego
- 11. Jakie są motywy kompilacji kodu bajtowego?
- 12. Kod powrotu celu IntelliJ dla kodu bajtowego
- 13. Sens „>>” w Pythonie kodu bajtowego
- 14. bezpieczne miejsce do zapisania kodu
- 15. Bezpieczne logowanie: szyfrowanie klucza publicznego w PHP i Javascript
- 16. Bezpieczne szyfrowanie https dla aplikacji na iPhone do strony internetowej:
- 17. Android szyfrowanie/odszyfrowywanie bazy danych sqlite w 100% bezpieczne
- 18. Czy bezpieczne jest szyfrowanie ciągu za pomocą tego samego ciągu znaków, co klucz?
- 19. Jak bezpieczne jest moje bezpieczne ponowne rzucenie?
- 20. Szyfrowanie symetryczne (AES): Czy zapisywanie IV i soli wraz z zaszyfrowanymi danymi jest bezpieczne i właściwe?
- 21. Generowanie kodu bajtowego JVM dla jednoargumentowego nie wyrażenia
- 22. Najlepsze narzędzie (narzędzia) do dekompilacji kodu bajtowego Lua?
- 23. Dowolny C/C++ na natywny kompilator/interpretatory kodu bajtowego?
- 24. Zmienne remapper podczas metody kodu bajtowego Inlining przez ASM
- 25. Niezgodny argument do funkcji z instrumentacją kodu bajtowego ASM
- 26. Tworzenie kodu bajtowego Pythona z listy kodów i argumentów?
- 27. Jak skompilować kod zestawu JVM do kodu bajtowego?
- 28. Odczytywanie instrukcji kodu bajtowego Java: Co oznacza ta liczba?
- 29. Bezpieczne jest równe makro?
- 30. jest bezpieczne NetNamedPipeBinding?
Kod bajtowy nigdy nie jest zoptymalizowany, przynajmniej nie na ważne sposoby. –
Nie śledzę twojego dokładnego znaczenia. Masz na myśli, że konwersja z .java do .class przez javac nie wymaga dużej optymalizacji? –
Tak, prawie żadna optymalizacja nie jest wykonywana w tym kroku. Jest to w większości proste tłumaczenie. W rzeczywistości próba optymalizacji kodu bajtowego może zepsuć optymalizacje kompilatora JIT i spowolnić działanie kodu. –