混淆字符串

时间:2015-01-19 11:49:47

标签: java obfuscation credentials

我们在App中使用了一些Networkcredentials。我只是反编译应用程序,并能够看到名称和密码等凭据。我真的没有办法防止这种情况发生。我认为" obfuscator"是我必须走的方向。 我们测试proguard但它没有字符串加密或我错了吗?

有一种简单而自由的方法吗?

谢谢。

4 个答案:

答案 0 :(得分:5)

抱歉,无论您尝试什么,这都无济于事。如果您对凭据进行模糊处理/加密,程序仍然必须能够在运行时解密它们。因此,加密密钥也必须在某处生成的字节码中,因此可以接受它们,并在程序外手动解密凭证(或者只需逐步执行程序并读取凭证解密的)。

您尝试做的是Security by Obscurity,但它无法正常工作。

无论你做什么,如果程序可以在没有任何外部帮助的情况下在运行时获取凭据,那么熟练的攻击者可以在给定足够时间的情况下做同样的事情。

你应该做什么:

  1. 以明文形式将凭据存储在属性文件中。不要为加密而烦恼,这是毫无意义的。您必须确保您使用的数据库用户是只读或仅添加或类似的,以防止任何损坏。
  2. 让用户输入密码。如果它没有存储在字节码中,那么它是安全的。他可以,例如输入密码并在数据库中拥有一个帐户...
  3. 使用安全且已知的身份验证机制。明文登录+密码不是那个。
  4. 不要让你的应用程序靠近数据库。使用API​​在某处设置服务,该API将保持读取DB连接。您的应用程序可以连接到该应用程序并通过此API获取数据。这样,攻击者无法直接访问您的数据库。不过,他可以在新服务中调用任何内容,因此您必须确保其中没有可访问的敏感数据。

答案 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.UnsupportedEncodingExceptionjava.security.MessageDigestjava.security.NoSuchAlgorithmException

答案 2 :(得分:0)

您的问题与加密有关,而不是模糊处理。您可以使用此库以加密方式存储凭据:http://www.jasypt.org/encrypting-configuration.html 有不同的方法可以将加密密钥传递给它。

否则,根据您的上下文,请考虑使用不同的身份验证机制(类似SSO)而不是登录/密码。

答案 3 :(得分:0)

以下article显示了如何在运行时对字符串进行模糊处理而无需对其进行模糊处理。请参阅this开源产品。