We decided to use HTTP instead of HTTP, but after googling I did that SSL is not enough.
I'm not sure that you are googled, but SSL / TLS, if used correctly, can protect you from MITM attacks.
If this solution (SSL + symmetric encryption algorithm) is ok, can you advise the most suitable encryption algorithms for this kind of problem?
SSL / TLS encryption is already performed using symmetric cryptography. Only authentication is performed using asymmetric cryptography.
As I understand it, there are two main vulnerabilities when using SSL: 1) Now there are many CA service providers, so no one is protected from a MITM attack, where crackers use an ordinary certificate (I found several articles where it was said that VeriSign has a secret department, which provided secret services for MITM when VeriSign was the only CA in the whole world) 2) Most MITM attacks are possible during using ARP Cache Poisoning
MITM attack protection is precisely the purpose of the certificate. The client is only responsible for verifying that HTTPS is used when it is expected, and (b) verify the correctness of the server certificate.
The first point may be obvious, but this is the type of attack that tools like sslstrip make: they are down-MITM attacks that prevent the user from fully navigating to the HTTPS page. As a user, make sure you are on the HTTPS page when it should be HTTPS. In a corporate environment, tell your users that they need to verify that they are accessing your server using HTTPS: only they can know (if you do not want to use client certificate authentication).
The second point (certificate verification) also depends on the client, although most of it is automated in the browser. The user is responsible not to ignore browser warnings. The rest of the certificate verification is typically performed using pre-installed CA certificates (e.g. Verisign's).
If a MITM attack occurs (possibly using ARP poisoning), the user must receive the wrong certificate and should not act. Proper HTTPS checks should allow you to have a secure connection or no connection at all.
The vulnerabilities you mention are related to certificate validation (PKI model). Indeed, validating the server certificate depends on the CA certificates that your browser trusts. There, any trusted CA can, in principle, issue a certificate for any server, so this model is good as the weakest CA in the list. If one of the trusted CAs issues a fake certificate for the site and transfers it to the other party, it also has the right to have a passport office issuing a real "fake" passport. It's pretty hard to come across, but there are ways around this.
You can count on extensions, such as Prospective projects that control certificate changes, even if both trust. Such a warning should prompt the user to investigate whether the certificate change was legal (made by your company) or not.
More radically, you can deploy your own CA, remove all trusted CA certificates from the user's browser, and install only your own CA certificate. In this case, users will be able to securely connect to machines that have certificates issued by your CA. This can be a problem (including for software updates if your browser uses the OS certificate repository).
Basically, you can opt out of the certificate altogether and use Pre-Shared Keys . However, this is not supported by all SSL / TLS stacks and is not necessarily adapted for HTTP over TLS (in the absence of a specification for checking hostnames, as far as I know).
You may also be interested in these questions at Security.SE: