Your number 3 is only insecure if you use .NETs clear text config file. What is keeping you from having your own external encrypted text file that has the information? Or even internal for that matter. This has more to do with the design of your application than anything. You can set connect strings through StrataFrame about 5 different ways...so the issue is how and where do you want to get your connection information from? Once you have this you can set the connection any way that you would like.
For example, StrataFrame has encryption classes that allow you to encrypt and decrypt whole files using 3DES.
Dim lo3DES As New MicroFour.StrataFrame.Security.Encryption.TripleDESWrapper()
lo3DES.EncryptFile("c:\temp\MyConnectionFile.xml")
lo3DES.DecryptFile("c:\temp\MyConnectionFile.xml")
You could even decrypt the file into memory so that it never exists on disk in a decrypted format:
Dim loStream As New MemoryStream()
Dim loReader As New StreamReader(loStream)
Dim lcDecryptedText As String
'-- Decrypt the file into a memory stream
lo3DES.DecryptFileToStream("c:\temp\MyConnectionFile.xml", loStream)
'-- Convert the stream into a text string
loStream.Seek(0, SeekOrigin.Begin)
lcDecryptedText = loReader.ReadToEnd()
'-- Do whatever you want with the decrypted data
'-- Clean Up
loReader.Close()
This really has more to do with how you want to distribute your application and connect your end-user to the server. You know the requirements that you app has...there are hundreds of ways to take a stored connection string and load it up. For example, in our medical application, we have a server that authenticates the concurrent users and much more. The only thing that gets entered on a client install is the name of the server (and we have detection classes for that as well). When the end-user goes into our medical software, it talks to the server, which in turn gives the client the connection information. This way is it all controlled from a single location...the server. Once we get the connection information we manually set the data sources. This requires no intervention on the part of the end-user going into the application.
So this is more of a design issue related to your application.