簡體   English   中英

在 SharedPreferences 中加密和解密 Android 字符串

[英]Encrypt and Decrypt Android String in SharedPreferences

我需要在 SharedPreferences 中保存和加載 String savedText,所以我需要加密和解密我的字符串。 我將字符串保存在 saveText() 並在 loadText(String UNIC) 加載。 UNIC 是用來保存我的字符串的 ID。 我有這個代碼,它可以工作,但它不會加密。

     private void saveText() throws GeneralSecurityException, IOException {

            for (int i = 0; i < myArr.size(); i++) { //here i create my string
                SAVEDITEMS = SAVEDITEMS + myArr.get(i).replace("✔", "") + "&";
            } 

          KeyGenParameterSpec keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC;
            String masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec);


            String fileToWrite = SAVEDITEMS;
           //getFilesDir() is ok? is was variable directory at documentation

            try {
                EncryptedFile encryptedFile = new EncryptedFile.Builder(
                        new File(getApplicationContext().getFilesDir(), fileToWrite),
                        getApplicationContext(),
                        masterKeyAlias,
                        EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
                ).build();


                BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                        encryptedFile.openFileOutput()));
                writer.write("MY SUPER-SECRET INFORMATION");
            } catch (GeneralSecurityException gse) {
                // Error occurred getting or creating keyset.
            } catch (IOException ex) {
                // Error occurred opening file for writing.
            }

            sPref = getPreferences(MODE_PRIVATE);
            SharedPreferences.Editor ed = sPref.edit();
            ed.putString(UNIC, SAVEDITEMS);
            ed.commit();

        }

        private void loadText(String UNIC) throws GeneralSecurityException, IOException {

            KeyGenParameterSpec keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC;
            String masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec);

            String fileToRead = SAVEDITEMS;

            EncryptedFile encryptedFile = new EncryptedFile.Builder(
                    new File(getApplicationContext().getFilesDir(), fileToRead),
                    getApplicationContext(),
                    masterKeyAlias,
                    EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
            ).build();

            StringBuffer stringBuffer = new StringBuffer();
            try (BufferedReader reader =
                         new BufferedReader(new FileReader(String.valueOf(encryptedFile)))) {

                String line = reader.readLine();
                while (line != null) {
                    stringBuffer.append(line).append('\n');
                    line = reader.readLine();
                }
            } catch (IOException e) {
                // Error occurred opening raw file for reading.
            } finally {
                String contents = stringBuffer.toString();
            }


            sPref = getPreferences(MODE_PRIVATE);
            String savedText = sPref.getString(UNIC, SAVEDITEMS);

            //here i toast my string
                        Toast toast = Toast.makeText(getApplicationContext(),
                                savedText, Toast.LENGTH_SHORT);
                        toast.show();

            }


        }

請幫助我,是 getFilesDir() 還是其他地方的問題? 謝謝你的幫助。 這對我來說真的很重要。

您可以使用Hawk ,它支持數據的加密和解密,並使用共享首選項來存儲加密的數據。

這是流程:

在此處輸入圖像描述 (來源: https://github.com/orhanobut/hawk

您可以使用這些方法加密和解密您的字符串,並將結果保存在SharedPreferences中:

public static byte[] encrypt(byte[] plaintext, SecretKey key, byte[] IV) throws Exception
{  
    Cipher cipher = Cipher.getInstance("AES");
    SecretKeySpec keySpec = new SecretKeySpec(key.getEncoded(), "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(IV);
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
    byte[] cipherText = cipher.doFinal(plaintext);
    return cipherText;
}

對於解密:

public static String decrypt(byte[] cipherText, SecretKey key, byte[] IV)
{
    try {
        Cipher cipher = Cipher.getInstance("AES");
        SecretKeySpec keySpec = new SecretKeySpec(key.getEncoded(), "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(IV);
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
        byte[] decryptedText = cipher.doFinal(cipherText);
        return new String(decryptedText);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM