有时你需要在应用程序本身中存储一个密码,例如用于与自己的服务器通信的用户名/密码。在这些情况下,不可能按照存储密码的正常过程进行操作,即散列密码、存储散列、与散列用户输入进行比较,因为您没有任何用户输入可与散列进行比较。密码需要由应用程序本身提供。那么如何保护apk中存储的密码呢?像下面这样的密码生成函数是合理安全的吗?
纯文本:
String password = "$()&HDI?=!";
简单的模糊处理:
private String getPassword(){
String pool = "%&/@$()7?=!656sd8KJ%&HDI!!!G98y/&%=?=*^%&ft4%(";
return pool.substring(4, 7) + pool.substring(20, 24) + pool.substring(8, 11);
}
我知道proguard有一些模糊处理功能,但我很好奇上面的“模糊处理”技术在编译时会做什么,以及通过查看apk和/或使用其他更复杂的技术来找出它有多难?
1条答案
按热度按时间ni65a41a1#
热释光;如果你知道如何反编译apk,你可以很容易地得到密码,不管代码有多混乱。不要将密码存储在apk中,这是不安全的。
我知道proguard有一些模糊处理功能,但我很好奇上面的“模糊处理”技术在编译时会做什么,以及通过查看apk和/或使用其他更复杂的技术来找出它有多难?
我会告诉你这有多容易。以下是我们将反编译的android sscce:
MyActivity.java
:public class MyActivity extends Activity
{
private String getPassword()
{
return "%&/@$()7?=!656sd8KJ%&HDI!!!G98y/&%=?=*^%&ft4%(".substring(4, 7)
"%&/@$()7?=!656sd8KJ%&HDI!!!G98y/&%=?=*^%&ft4%(".substring(20, 24)
"%&/@$()7?=!656sd8KJ%&HDI!!!G98y/&%=?=*^%&ft4%(".substring(8, 11);
}
public void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);
setContentView(2130903040);
((TextView)findViewById(2131034112)).setText(getPassword());
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
private String xor(String a, String b) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < a.length() && i < b.length(); i++) {
sb.append((char) (a.charAt(i) ^ b.charAt(i)));
}
return sb.toString();
}
public void onCreate(Bundle paramBundle)
{
super.onCreate(paramBundle);
setContentView(2130903040);
((TextView)findViewById(2131034112)).setText(xor("A@NCyw&IHY", "ehge13ovux"));
}
private String xor(String paramString1, String paramString2)
{
StringBuilder localStringBuilder = new StringBuilder();
for (int i = 0; (i < paramString1.length()) && (i < paramString2.length()); i++) {
localStringBuilder.append((char)(paramString1.charAt(i) ^ paramString2.charAt(i)));
}
return localStringBuilder.toString();
}