我们在App中使用了一些Networkcredentials。我只是反编译应用程序,并能够看到名称和密码等凭据。我真的没有办法防止这种情况发生。我认为" obfuscator"是我必须走的方向。 我们测试proguard但它没有字符串加密或我错了吗?
有一种简单而自由的方法吗?
谢谢。
答案 0 :(得分:5)
抱歉,无论您尝试什么,这都无济于事。如果您对凭据进行模糊处理/加密,程序仍然必须能够在运行时解密它们。因此,加密密钥也必须在某处生成的字节码中,因此可以接受它们,并在程序外手动解密凭证(或者只需逐步执行程序并读取凭证解密的)。
您尝试做的是Security by Obscurity,但它无法正常工作。
无论你做什么,如果程序可以在没有任何外部帮助的情况下在运行时获取凭据,那么熟练的攻击者可以在给定足够时间的情况下做同样的事情。
你应该做什么:
答案 1 :(得分:1)
您应该考虑加密用户名和密码:How to encrypt String in Java。
// bytes to encrypt
byte[] input;
// the key and the initialization vector
byte[] keyBytes;
byte[] ivBytes;
// initialize the Cipher
SecretKeySpec key = new SecretKeySpec(keyBytes, "DES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
// encryption
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] encrypted= new byte[cipher.getOutputSize(input.length)];
int enc_len = cipher.update(input, 0, input.length, encrypted, 0);
enc_len += cipher.doFinal(encrypted, enc_len);
// decryption
cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
byte[] decrypted = new byte[cipher.getOutputSize(enc_len)];
int dec_len = cipher.update(encrypted, 0, enc_len, decrypted, 0);
dec_len += cipher.doFinal(decrypted, dec_len);
通常,key
(字节数组)应存储在一个文件中,该文件只能在服务器运行的特定实例上访问,而不能编码到应用程序源文件中。
否则您可以使用哈希(例如: md5 或 sha1 )并存储指纹而不是普通字符串:
// SHA1("hello world") -> "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
这是一个简单的方法,允许您计算字符串的SHA1 hash
:
public static String SHA1(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(text.getBytes("iso-8859-1"));
byte[] hash = md.digest();
Formatter formatter = new Formatter();
for (byte b : hash)
formatter.format("%02x", b);
return formatter.toString();
}
需要导入java.io.UnsupportedEncodingException
,java.security.MessageDigest
和java.security.NoSuchAlgorithmException
。
答案 2 :(得分:0)
您的问题与加密有关,而不是模糊处理。您可以使用此库以加密方式存储凭据:http://www.jasypt.org/encrypting-configuration.html 有不同的方法可以将加密密钥传递给它。
否则,根据您的上下文,请考虑使用不同的身份验证机制(类似SSO)而不是登录/密码。
答案 3 :(得分:0)