Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8741669
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 13, 20262026-06-13T11:21:28+00:00 2026-06-13T11:21:28+00:00

Assuming that I’m trying to pull from a RESTful api that uses basic authentication

  • 0

Assuming that I’m trying to pull from a RESTful api that uses basic authentication / basic certificates, what would be the best way to store that user name and password in my program? Right now it’s just sitting there in plaintext.

UsernamePasswordCredentials creds = new UsernamePasswordCredentials("myName@myserver","myPassword1234");

Is there some way of doing this that is more security minded?

Thanks

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-13T11:21:29+00:00Added an answer on June 13, 2026 at 11:21 am

    Important note:

    If you’re designing the authentication system as a whole, you shouldn’t store passwords, even if they’re encrypted. You store a hash, and check if passwords provided during login match the same hash. That way, a security breach on your database avoids getting your users’ passwords exposed.

    With that said, for situations where you are going to store data as-is (in this case passwords), then with an inner-to-outer mindset, here are some steps to protect your process:


    First step, you should change your password-handling from String to character array.

    The reason for this is that a String is an immutable object, and so it’s data will not be cleansed immediately even if the object is set to null; The data is set for garbage-collection instead, and this poses security problems because malicious programs might gain access to that String (password) data before it is cleaned.

    This is the main reason why Swing’s JPasswordField’s getText() method is deprecated, and why getPassword() uses character arrays.


    The second step is to encrypt your credentials, only decrypting them temporarily during the authentication process. Or to hash them server-side, store that hash, and "forget" the original password.

    This, similarly to the first step, makes sure your vulnerability-time is as small as possible.

    It is recommended that your credentials are not hard-coded, and that instead, you store them in a centralized, configurable and easily-maintainable manner, such as a configuration or properties file, or a database.

    You should encrypt your credentials before saving the file, and additionally, you can apply a second encryption to the file itself (2-layer encryption to the credentials, and 1-layer to other file contents).

    Note that each of the two encryption processes mentioned above can be multiple-layered themselves. Each encryption can be an individual application of Triple Data Encryption Standard (AKA TDES and 3DES), as a conceptual example.


    After your local environment is properly protected (but remember, it’s never ever "safe"!), the third step is apply basic protection to your transmission process, by using TLS (Transport Layer Security) or SSL (Secure Sockets Layer).


    The forth step is to apply other protection methods.

    For example, applying obfuscation techniques to your "to-use" compile, to avoid (even if shortly) the exposure of your security measures in case your program is obtained by Ms. Eve, Mr. Mallory, or someone else (the bad-guys) and decompiled.


    UPDATE 1:

    By @Damien.Bell ‘s request, here is an example that covers the first and second steps:

        //These will be used as the source of the configuration file's stored attributes.
        private static final Map<String, String> COMMON_ATTRIBUTES = new HashMap<String, String>();
        private static final Map<String, char[]> SECURE_ATTRIBUTES = new HashMap<String, char[]>();
        //Ciphering (encryption and decryption) password/key.
        private static final char[] PASSWORD = "Unauthorized_Personel_Is_Unauthorized".toCharArray();
        //Cipher salt.
        private static final byte[] SALT = {
            (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12,
            (byte) 0xde, (byte) 0x33, (byte) 0x10, (byte) 0x12,};
        //Desktop dir:
        private static final File DESKTOP = new File(System.getProperty("user.home") + "/Desktop");
        //File names:
        private static final String NO_ENCRYPTION = "no_layers.txt";
        private static final String SINGLE_LAYER = "single_layer.txt";
        private static final String DOUBLE_LAYER = "double_layer.txt";
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) throws GeneralSecurityException, FileNotFoundException, IOException {
            //Set common attributes.
            COMMON_ATTRIBUTES.put("Gender", "Male");
            COMMON_ATTRIBUTES.put("Age", "21");
            COMMON_ATTRIBUTES.put("Name", "Hypot Hetical");
            COMMON_ATTRIBUTES.put("Nickname", "HH");
    
            /*
             * Set secure attributes.
             * NOTE: Ignore the use of Strings here, it's being used for convenience only.
             * In real implementations, JPasswordField.getPassword() would send the arrays directly.
             */
            SECURE_ATTRIBUTES.put("Username", "Hypothetical".toCharArray());
            SECURE_ATTRIBUTES.put("Password", "LetMePass_Word".toCharArray());
    
            /*
             * For demosntration purposes, I make the three encryption layer-levels I mention.
             * To leave no doubt the code works, I use real file IO.
             */
            //File without encryption.
            create_EncryptedFile(NO_ENCRYPTION, COMMON_ATTRIBUTES, SECURE_ATTRIBUTES, 0);
            //File with encryption to secure attributes only.
            create_EncryptedFile(SINGLE_LAYER, COMMON_ATTRIBUTES, SECURE_ATTRIBUTES, 1);
            //File completely encrypted, including re-encryption of secure attributes.
            create_EncryptedFile(DOUBLE_LAYER, COMMON_ATTRIBUTES, SECURE_ATTRIBUTES, 2);
    
            /*
             * Show contents of all three encryption levels, from file.
             */
            System.out.println("NO ENCRYPTION: \n" + readFile_NoDecryption(NO_ENCRYPTION) + "\n\n\n");
            System.out.println("SINGLE LAYER ENCRYPTION: \n" + readFile_NoDecryption(SINGLE_LAYER) + "\n\n\n");
            System.out.println("DOUBLE LAYER ENCRYPTION: \n" + readFile_NoDecryption(DOUBLE_LAYER) + "\n\n\n");
    
            /*
             * Decryption is demonstrated with the Double-Layer encryption file.
             */
            //Descrypt first layer. (file content) (REMEMBER: Layers are in reverse order from writing).
            String decryptedContent = readFile_ApplyDecryption(DOUBLE_LAYER);
            System.out.println("READ: [first layer decrypted]\n" + decryptedContent + "\n\n\n");
            //Decrypt second layer (secure data).
            for (String line : decryptedContent.split("\n")) {
                String[] pair = line.split(": ", 2);
                if (pair[0].equalsIgnoreCase("Username") || pair[0].equalsIgnoreCase("Password")) {
                    System.out.println("Decrypted: " + pair[0] + ": " + decrypt(pair[1]));
                }
            }
        }
    
        private static String encrypt(byte[] property) throws GeneralSecurityException {
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
            SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD));
            Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
            pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20));
    
            //Encrypt and save to temporary storage.
            String encrypted = Base64.encodeBytes(pbeCipher.doFinal(property));
    
            //Cleanup data-sources - Leave no traces behind.
            for (int i = 0; i < property.length; i++) {
                property[i] = 0;
            }
            property = null;
            System.gc();
    
            //Return encryption result.
            return encrypted;
        }
    
        private static String encrypt(char[] property) throws GeneralSecurityException {
            //Prepare and encrypt.
            byte[] bytes = new byte[property.length];
            for (int i = 0; i < property.length; i++) {
                bytes[i] = (byte) property[i];
            }
            String encrypted = encrypt(bytes);
    
            /*
             * Cleanup property here. (child data-source 'bytes' is cleaned inside 'encrypt(byte[])').
             * It's not being done because the sources are being used multiple times for the different layer samples.
             */
    //      for (int i = 0; i < property.length; i++) { //cleanup allocated data.
    //          property[i] = 0;
    //      }
    //      property = null; //de-allocate data (set for GC).
    //      System.gc(); //Attempt triggering garbage-collection.
    
            return encrypted;
        }
    
        private static String encrypt(String property) throws GeneralSecurityException {
            String encrypted = encrypt(property.getBytes());
            /*
             * Strings can't really have their allocated data cleaned before CG,
             * that's why secure data should be handled with char[] or byte[].
             * Still, don't forget to set for GC, even for data of sesser importancy;
             * You are making everything safer still, and freeing up memory as bonus.
             */
            property = null;
            return encrypted;
        }
    
        private static String decrypt(String property) throws GeneralSecurityException, IOException {
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
            SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD));
            Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
            pbeCipher.init(Cipher.DECRYPT_MODE, key, new PBEParameterSpec(SALT, 20));
            return new String(pbeCipher.doFinal(Base64.decode(property)));
        }
    
        private static void create_EncryptedFile(
                        String fileName,
                        Map<String, String> commonAttributes,
                        Map<String, char[]> secureAttributes,
                        int layers)
                        throws GeneralSecurityException, FileNotFoundException, IOException {
            StringBuilder sb = new StringBuilder();
            for (String k : commonAttributes.keySet()) {
                sb.append(k).append(": ").append(commonAttributes.get(k)).append(System.lineSeparator());
            }
            //First encryption layer. Encrypts secure attribute values only.
            for (String k : secureAttributes.keySet()) {
                String encryptedValue;
                if (layers >= 1) {
                    encryptedValue = encrypt(secureAttributes.get(k));
                } else {
                    encryptedValue = new String(secureAttributes.get(k));
                }
                sb.append(k).append(": ").append(encryptedValue).append(System.lineSeparator());
            }
    
            //Prepare file and file-writing process.
            File f = new File(DESKTOP, fileName);
            if (!f.getParentFile().exists()) {
                f.getParentFile().mkdirs();
            } else if (f.exists()) {
                f.delete();
            }
            BufferedWriter bw = new BufferedWriter(new FileWriter(f));
            //Second encryption layer. Encrypts whole file content including previously encrypted stuff.
            if (layers >= 2) {
                bw.append(encrypt(sb.toString().trim()));
            } else {
                bw.append(sb.toString().trim());
            }
            bw.flush();
            bw.close();
        }
    
        private static String readFile_NoDecryption(String fileName) throws FileNotFoundException, IOException, GeneralSecurityException {
            File f = new File(DESKTOP, fileName);
            BufferedReader br = new BufferedReader(new FileReader(f));
            StringBuilder sb = new StringBuilder();
            while (br.ready()) {
                sb.append(br.readLine()).append(System.lineSeparator());
            }
            return sb.toString();
        }
    
        private static String readFile_ApplyDecryption(String fileName) throws FileNotFoundException, IOException, GeneralSecurityException {
            File f = new File(DESKTOP, fileName);
            BufferedReader br = new BufferedReader(new FileReader(f));
            StringBuilder sb = new StringBuilder();
            while (br.ready()) {
                sb.append(br.readLine()).append(System.lineSeparator());
            }
            return decrypt(sb.toString());
        }
    

    A full example, addressing every protection step, would far exceed what I think is reasonable for this question, since it’s about "what are the steps", not "how to apply them".

    It would far over-size my answer (at last the sampling), while other questions here on S.O. are already directed on the "How to" of those steps, being far more appropriate, and offering far better explanation and sampling on the implementation of each individual step.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Assuming that active directory is set up correctly, I'm trying to find a way
Assuming that parsing the equation would not be a problem, how can I make
Assuming that best practices have been followed when designing a new database, how does
Assuming that a C# program uses only managed .NET code, is it possible to
Assuming that it's even possible, what would be your recomendations to make a bundle
Assuming that I have function get_a_color in a Django views.py: from django.utils import simplejson
Assuming that it is possible to compress a file from within an NSIS script,
Assuming that I have a class named Class , And I would like to
Assuming that the data has been retrieved from the Db and put into an
Assuming that the user is already authenticated using the javascript SDK, how would you

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.