Android 可接受的存储加密密码的方法

Android 可接受的存储加密密码的方法,android,encryption,aes,password-encryption,firebase-remote-config,Android,Encryption,Aes,Password Encryption,Firebase Remote Config,我正在考虑一种可以“尝试保护”我的应用程序数据的方法 最初,我做了以下工作: 我有一个加密密钥,用于加密和解密接收到的数据,以及存储的内容,我使用firebase作为后端 基本上是这样的: private String encriptar(String datos, String password) throws Exception { SecretKeySpec secretKey = generateKey(password); Cipher cipher

我正在考虑一种可以“尝试保护”我的应用程序数据的方法

最初,我做了以下工作:

我有一个加密密钥,用于加密和解密接收到的数据,以及存储的内容,我使用firebase作为后端

基本上是这样的:

 private String encriptar(String datos, String password) throws Exception {
        SecretKeySpec secretKey = generateKey(password);
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] datosEncriptadosBytes = cipher.doFinal(datos.getBytes());
        String datosEncriptadosString = Base64.encodeToString(datosEncriptadosBytes, Base64.DEFAULT);
        return datosEncriptadosString;
    }

    private String desencriptar(String datos, String password) throws Exception {
        SecretKeySpec secretKey = generateKey(password);
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] datosDescoficados = Base64.decode(datos, Base64.DEFAULT);
        byte[] datosDesencriptadosByte = cipher.doFinal(datosDescoficados);
        String datosDesencriptadosString = new String(datosDesencriptadosByte);
        return datosDesencriptadosString;
    }


    private SecretKeySpec generateKey(String password) throws Exception {
        MessageDigest sha = MessageDigest.getInstance("SHA-256");
        byte[] key = password.getBytes("UTF-8");
        key = sha.digest(key);
        SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
        return secretKey;
    }
您可以看到,在所有三种方法中,加密、解密和生成密钥都需要密码值

我曾计划将此密码保存为firebase中的“Remote confing”,并在使用时获取它,但有许多对服务器的调用。另一个选项是将其存储在本地,但如果我这样做,则密码将是SharedReferences中的纯文本

我对如何处理这个问题有些困惑

我是这方面的新手(你可能已经看到了),如果知道我的方法是否正确,以及你会给我什么建议,我将不胜感激


非常感谢。Firebase为您提供加密服务。您在网络中发送的数据不是纯文本。要确保数据库安全,请考虑添加安全规则。


我对答案感到困惑。如果我从firebase的实时数据库中获取一个值,并将其保存为共享首选项中的字符串,那么在控制台logcat中显示日志时,它将显示为纯文本,可以毫无问题地读取。很抱歉不理解您的意思,我希望您能给我一个解释。Firebase会在流量(网络)中对您的数据进行加密,并在数据到达客户端时对其进行解密。因此,您可以用纯文本阅读它。通常,我会建议不要手动存储密码,并设置Firebase身份验证服务。另外,如果您担心API密钥,可以考虑将它们存储在服务器上的环境配置文件中,并通过云函数访问它们。设置起来可能有点复杂。看,你真的需要准确地定义你希望保护自己的东西。在你确切地知道你要解决什么问题之前,到处乱扔一堆密码学或多或少是没有意义的。这在您的问题中并不明显-请您澄清一下好吗?一般来说,您在应用程序中所能做的事情都是由对您的应用程序进行反向工程的攻击者无法完成的。没有什么。娜达。内加罗尼。你所能做的最好的事情就是让攻击者放弃并追踪另一个目标。当然,我想使用加密来存储密钥,例如YouTube、Instagram等的api。我将api密钥保存在一个已经加密的字符串中。例如,“gs6hw82hd5g28wbs8wjo>=”当我需要使用apikey时,我将使用密码对其进行解密,并且它将再次可读以发送到Web服务。密码必须在代码中声明。我是说那个密码对。你不需要加密,你需要授权——一种控制访问该密钥的机制。通常,这是通过拥有一个后端服务来实现的,该服务可以代表用户使用API密钥发出请求。