Domanda

Ho un file delle proprietà in Java, nel quale memorizzo tutte le informazioni della mia app, come il nome del file immagine del logo, il nome del database, l'utente del database e la password del database.
Posso memorizzare la password crittografata nel file delle proprietà.
Ma la chiave o la passphrase possono essere lette dal vaso usando un decompilatore.
Esiste un modo per archiviare il db pass in un file delle proprietà in modo sicuro?

È stato utile?

Soluzione

Esistono diversi modi per gestirlo. Se riesci a capire come fare in modo che un utente fornisca una password per un keystore all'avvio dell'applicazione, il modo più appropriato sarebbe crittografare tutti i valori utilizzando una chiave e archiviare questa chiave nel keystore. L'interfaccia della riga di comando per il keystore è usando keytool. Tuttavia, JSE dispone di API per accedere a livello di codice anche al keystore.

Se non si ha la possibilità di avere un utente che fornisce manualmente una password al keystore all'avvio (diciamo per un'applicazione web), un modo per farlo è scrivere una routine di offuscamento eccezionalmente complessa che può offuscare la chiave e archiviarlo anche in un file delle proprietà. Cose importanti da ricordare è che la logica di offuscamento e deobfuscazione dovrebbe essere a più livelli (potrebbe implicare la confusione, la codifica, l'introduzione di caratteri spuri ecc. Ecc.) E dovrebbe avere almeno una chiave che potrebbe essere nascosta in altre classi dell'applicazione usando nomi non intuitivi. Questo non è un meccanismo completamente sicuro dal momento che qualcuno con un decompilatore e una buona quantità di tempo e intelligenza può ancora aggirarlo, ma è l'unico che conosco che non richiede di entrare nel codice nativo (cioè non facilmente decompilabile) .

Altri suggerimenti

Memorizzi un hash SHA1 della password nel tuo file delle proprietà. Quindi, quando convalidi la password di un utente, esegui l'hash del tentativo di accesso e assicurati che i due hash corrispondano.

Questo è il codice che conterrà alcuni byte per te. Puoi facilmente gerarchizzare byte da una stringa usando il metodo getBytes () .

/**
     * Returns the hash value of the given chars
     * 
     * Uses the default hash algorithm described above
     * 
     * @param in
     *            the byte[] to hash
     * @return a byte[] of hashed values
     */
    public static byte[] getHashedBytes(byte[] in)
    {
        MessageDigest msg;
        try
        {
            msg = MessageDigest.getInstance(hashingAlgorithmUsed);
        }
        catch (NoSuchAlgorithmException e)
        {
            throw new AssertionError("Someone chose to use a hashing algorithm that doesn't exist.  Epic fail, go change it in the Util file.  SHA(1) or MD5");
        }
        msg.update(in);
        return msg.digest();
    }

No non c'è. Anche se lo crittograferai, qualcuno decompilerà il codice che lo decodifica.

È possibile creare un file di proprietà separato (esterno al vaso) per le password (password DB diretta o passphrase chiave) e non includere quel file di proprietà con la distribuzione. Oppure potresti essere in grado di fare in modo che il server accetti tale accesso da una macchina specifica in modo da richiedere lo spoofing.

Oltre a crittografare le password come descritto sopra, inserire tutte le password in un file di proprietà separato e, durante la distribuzione, provare a fornire a questo file le autorizzazioni più bloccate possibili.

Ad esempio, se il tuo server delle applicazioni funziona su Linux / Unix come root , crea il file delle proprietà della password di proprietà di root con 400 / -r-- ------ autorizzazioni.

Non potresti avere l'app in contatto con un server su HTTPS e scaricare la password, dopo aver effettuato l'autenticazione in qualche modo?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top