I just realized that there is no best way to hide MySQL string connection password in my executable file, especially in JAR file. Even encrypting it in EXE would only slow down the process (although I’m not sure how much time would it take to get an encrypted password from an EXE file).
So, from my understanding, I need something in the middle that would do the add, edit, delete etc to the database. Seems like a job for REST API or maybe SOAP services.
My question is, which one should I use? Or should I use something else? I was thinking Zend Framework to create those REST APIs. Then, I would use Qt to create a desktop application to call those APIs. But if I proceed with REST, my application would be a 3 tier application. Wouldn’t it be better if I just create a web application? Maybe I should just stick to desktop application call those APIs since the application is already finished and I just need to change from connecting directly to MySQL to calling those APIs to perform tasks rather than changing the whole application to a web.
Any advice would be very helpful. Thanks in advance.
UPDATE:
I’m looking for a security that would protect my MySQL password connection.
Obfuscator would only obfuscate the code, it won’t hide my string database information which In my opinion can be easily found using grep after decompiling the JAR using tools like JAD.
About my application:
- Using a centralized MySQL database
- Thousands of user
- Contains sensitive information
- My client uses Linux and Windows
- My server uses Linux
- All access are done in LAN, no outside connection (from Internet etc)
My current solutions (comments please):
- Using REST APIs (safer since MySQL password is in the server)
- Using Qt with encryption to the password
It depends on what kind of security are you looking for. Is this to protect the application from the user? To protect the user’s data from other users? To protect multiple users’ data from one another? To protect the user’s data from an attacker?
In a lot of applications there’s nothing wrong with storing the database login credentials in plain text. In other cases, you might try:
Remember, there’s no such thing as perfect security, so whatever you settle on doesn’t need to be unbreakable. It just needs to be tough enough to break to make the hassle of circumventing the security mechanism exceed the value of the data. So, for example, if the data is a list of the top scores in Minesweeper, then ROT13 would probably be enough.
Edit:
I just want to add that, even if you can’t get around having to hard-code an encryption key in your application, there are obfuscators for Java, .NET, and most other popular languages/frameworks. One of the key uses of these tools is to hide sensitive hard-coded strings like encryption keys.
Edit 2:
Given the additional details about the app in question, only 1, 6 and 8 would apply in this case. And a SOAP API is more appropriate for #6 as George rightly pointed out.
I also want to mention that there are Java resource obfuscators that encrypt string literals. This is just one example.