Настоящий хакер все еще сможет расшифровать пароль, но вы можете сделать его немного сложнее, если вы не храните пароль в виде строкового литерала. Вы можете использовать:
private static final String KEY = new String(new char[]{'s', 'e', 'c', 'r', 'e', 't'});
Это приведет к кодам байт:
javap -c -v TestObfuscate
static {};
Code:
Stack=6, Locals=0, Args_size=0
0: new #10; //class java/lang/String
3: dup
4: bipush 6
6: newarray char
8: dup
9: iconst_0
10: bipush 115
12: castore
13: dup
14: iconst_1
15: bipush 101
17: castore
18: dup
19: iconst_2
20: bipush 99
22: castore
23: dup
24: iconst_3
25: bipush 114
27: castore
28: dup
29: iconst_4
30: bipush 101
32: castore
33: dup
34: iconst_5
35: bipush 116
37: castore
38: invokespecial #12; //Method java/lang/String."<init>":([C)V
41: putstatic #16; //Field KEY:Ljava/lang/String;
44: return
, тогда как
private static final String ZIP_PASSW="secret"
возвращает
Constant pool:
const #8 = String #9; // secret
Пожалуйста, обратите внимание, что я не называю постоянный PASSWORD
o r ZIP_PASSW
(это важно, если строка является общедоступной).
В качестве альтернативы или в дополнение к этому вы можете использовать инструмент обфускации, такой как ProGuard.
Я думаю, что это хороший вопрос, а в некоторых случаях асинхронный крипто (как все кричат, что это модное слово здесь) не поможет вам с этой проблемой. Например. когда вы хотите сохранить указанный пользователем пароль в своей базе данных приложений, который вам нужно получить в открытом виде, но вы не хотите хранить его в открытом тексте в db. Таким образом, ваше приложение должно быть в состоянии зашифровать И расшифровать его => у вас будет такая же проблема с ключом (соответственно два ключа для асинхронного шифрования), которые вам придется предоставить. Независимо от того, используете ли вы что-то синхронное как AES или нет. – tObi