+ {{ content }}
+
+ diff --git a/_layouts/no.html b/_layouts/no.html new file mode 100644 index 0000000..7ebc636 --- /dev/null +++ b/_layouts/no.html @@ -0,0 +1,14 @@ + + + + {% include head.html %} + +
+awk '$5 > 2000' /etc/ssh/moduli > "${HOME}/moduli"
wc -l "${HOME}/moduli" # make sure there is something left
@@ -149,8 +153,8 @@ If you don't want that, remove any `ssh-keygen` commands from the init script.
cd /etc/ssh
rm ssh_host_*key*
-ssh-keygen -t ed25519 -f ssh_host_ed25519_key < /dev/null
-ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key < /dev/null
+ssh-keygen -t ed25519 -f ssh_host_ed25519_key -N "" < /dev/null
+ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key -N "" < /dev/null
### Client authentication
@@ -182,7 +186,7 @@ Recommended `/etc/ssh/ssh_config` snippet:
Host *
PubkeyAuthentication yes
- HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ssh-ed25519,ssh-rsa
+ HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-ed25519,ssh-rsa
Generate client keys using the following commands:
@@ -209,7 +213,7 @@ Create the ssh-user group with `sudo groupadd ssh-user`, then add each ssh user
Symmetric ciphers are used to encrypt the data after the initial key exchange and authentication is complete.
-Here we have quite a few algorithms:
+Here we have quite a few algorithms (10-14 were removed in [OpenSSH 7.6][76release]):
1. 3des-cbc
1. aes128-cbc
@@ -237,7 +241,7 @@ We have to consider the following:
* *Block size*:
Does not apply to stream ciphers.
At least 128 bits.
- This eliminates 14 because CAST has a 64 bit block size.
+ This eliminates 13 and 14 because those have a 64 bit block size.
* *Cipher mode*:
The recommended approach here is to prefer [AE][ae] modes and optionally allow CTR for compatibility.
CTR with Encrypt-then-MAC is provably secure.
@@ -284,7 +288,6 @@ Here are the available MAC choices:
1. hmac-md5
1. hmac-md5-96
-1. hmac-ripemd160
1. hmac-sha1
1. hmac-sha1-96
1. hmac-sha2-256
@@ -293,7 +296,6 @@ Here are the available MAC choices:
1. umac-128
1. hmac-md5-etm@openssh.com
1. hmac-md5-96-etm@openssh.com
-1. hmac-ripemd160-etm@openssh.com
1. hmac-sha1-etm@openssh.com
1. hmac-sha1-96-etm@openssh.com
1. hmac-sha2-256-etm@openssh.com
@@ -320,12 +322,12 @@ The selection considerations:
Recommended `/etc/ssh/sshd_config` snippet:
-MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com
+MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
Recommended `/etc/ssh/ssh_config` snippet:
Host *
- MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com
+ MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
# Preventing key theft
@@ -334,6 +336,13 @@ The NSA has a database of stolen keys - you do not want your key there.
## System hardening
+OpenSSH has some undocumented, and rarely used features.
+UseRoaming is one such feature with a known vulnerability.
+
+Recommended `/etc/ssh/ssh_config` snippet:
+Host *
+ UseRoaming no
+
This post is not intended to be a comprehensive system security guide.
Very briefly:
@@ -451,9 +460,12 @@ I promise not to use `git push -f`.
[libsshdoc]: http://git.libssh.org/projects/libssh.git/tree/doc/curve25519-sha256@libssh.org.txt
[curve25519]: http://cr.yp.to/ecdh.html
[rfc4253]: https://www.ietf.org/rfc/rfc4253.txt
+[dh-draft]: https://tools.ietf.org/html/draft-ietf-curdle-ssh-modp-dh-sha2-09
+[73release]: https://www.openssh.com/releasenotes.html#7.3
+[76release]: https://www.openssh.com/releasenotes.html#7.6
[rfc4419]: https://www.ietf.org/rfc/rfc4419.txt
[ed25519]: http://ed25519.cr.yp.to/
-[google-auth]: https://code.google.com/p/google-authenticator/wiki/PamModuleInstructions
+[google-auth]: https://github.com/google/google-authenticator/wiki/PAM-Module-Instructions
[totp]: https://en.wikipedia.org/wiki/Time-based_One-time_Password_Algorithm
[otp]: https://www.cl.cam.ac.uk/~mgk25/otpw.html
[pam]: https://en.wikipedia.org/wiki/Pluggable_authentication_module
@@ -468,3 +480,4 @@ I promise not to use `git push -f`.
[sssh-wiki]: https://github.com/stribika/stribika.github.io/wiki/Secure-Secure-Shell
[changelog]: https://github.com/stribika/stribika.github.io/commits/master/_posts/2015-01-04-secure-secure-shell.md
[bug779880]: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=779880
+[sloth]: https://www.mitls.org/downloads/transcript-collisions.pdf
diff --git a/_posts/2015-08-07-why-cyber-deterrence-is-bullshit.md b/_posts/2015-08-07-why-cyber-deterrence-is-bullshit.md
new file mode 100644
index 0000000..b6c4c93
--- /dev/null
+++ b/_posts/2015-08-07-why-cyber-deterrence-is-bullshit.md
@@ -0,0 +1,46 @@
+---
+layout: post
+title: "Why cyber deterrence is bullshit"
+tags: [bullshit, cybercybercyber, deterrence]
+---
+
+You may have heard of [this brilliant idea](https://uk.businessinsider.com/us-retaliation-against-china-for-opm-hacks-2015-8).
+That's right, "hack back" as foreign policy.
+It does not and will never work.
+
+The reasons why this is utter bullshit should be all too obvious, but my Twitter account is locked and I have nothing better to do, so here goes:
+
+1. *The word cyber.*
+ Whenever you hear it, question the speaker's competence.
+1. *Easy access.*
+ To build nuclear weapons, you need: relatively rare fissionable materials, huge enrichment facilities, knowledge, and ICBMs.
+ To hack, you need: a computer, electricity, knowledge, and Internet access.
+ You may be able to deter a few rational entities capable of building nukes, but not every single child capable of hacking OPM.
+ There is nothing even close to perfect rationality on the Internet.
+1. *Attribution.*
+ Radars and satellites can clearly show where the missiles are coming from.
+ No such device exists for detecting the origin of a breach.
+ Attribution is purely guesswork, based on things like the language of strings found in the malware, source IPs, etc.
+ It's like sending a postcard, then trying to figure out who read it.
+ Does that sound like perfect detection?
+1. *Working defense.*
+ Missile defense systems are actually more dangerous that the nukes they are trying to defend against.
+ This is because they have a [very interesting property](https://en.wikipedia.org/wiki/Pre-emptive_nuclear_strike#Destabilizing_role_of_missile_defense):
+ They reduce the second strike capability of one side, making counterforce first strike the logical choice for the other.
+ The reason we are still all here, reading this post, is because covering large areas with such defenses is not feasible.
+ This is not the case for defending computers against intrusion.
+ Yes, attackers have a clear advantage over defenders, that is to say, hacking will always be possible.
+ But it is significantly more difficult, and the effect less devastating, if the opponent just doesn't have an OPM equivalent.
+ There goes your second strike.
+1. *It is not a fucking weapon.*
+ The damage caused by even the worst breaches is nowhere near the damage caused by a thermonuclear explosion.
+ Even conventional weapons cause more damage, and are more scary.
+ This is also supported by the fact that no sane person would risk armed conflict over hacking incidents.
+ No one is afraid of getting pwned.
+
+Today's attackers don't even need their advantage.
+They get in because we let them.
+We should focus on exploit mitigation (Grsecurity), isolation (Qubes), sandboxed multiprocess architectures (Chrome, qmail), encryption, and fixing shit.
+Instead we are wasting time trying to make the attribution dice work, listening to fumbling idiots threaten the Chinese, and looking for a magic security device that solves everything if we just connect it to the network.
+
+We know what to do and we know how to do it.
diff --git a/_posts/2015-11-23-service-discovery-and-authentication.md b/_posts/2015-11-23-service-discovery-and-authentication.md
new file mode 100644
index 0000000..916ccff
--- /dev/null
+++ b/_posts/2015-11-23-service-discovery-and-authentication.md
@@ -0,0 +1,104 @@
+---
+layout: post
+title: "Service discovery and authentication"
+tags: [java,security,zookeeper,tls]
+---
+
+[ZooKeeper][zk] is a popular choice for service discovery in distributed systems.
+It is a hierarchical key-value store with very strong consistency guarantees.
+What makes it a good choice for service discovery is its capability to create temporary tree nodes that disappear when the session that created it is disconnected.
+Another important feature is sequential nodes - nodes that have a consistent counter appended to their name.
+You can use these for implementing distributed locking for example.
+This post is about the authentication problems that appear as a result of introducting service discovery into a distributed system.
+
+# Service discovery
+
+The exact details of implementing a [service discovery protocol][zksvc] using ZooKeeper is outside the scope of this document.
+I want to describe it in enough details so that we can understand its security properties.
+Each service that's running and ready to respond to requests opens a persistent connection to Zookeeper.
+What usually happens is there is a root node, say /services, and it creates a temporary, sequential node:
+
+
+/services/foo-service-1 = https://somehost.inthecloud.internal:6666
+/services/foo-service-3 = https://otherhost.inthecloud.internal:12345
+
+
+If you want to talk to this foo-service, you look in this root node and retrieve all the registered foo-service hostnames.
+You pick one randomly, or using round-robin, or what have you, and talk to that.
+If it fails, you try another.
+If you shut down foo-service, or it crashes, the temporary node is removed and other services will no longer try to talk to it.
+
+# Authenticating hostnames
+
+In the example above, we are using HTTPS URLs, so you probably want some kind of internal CA to sign the certificates.
+(You might want to use some different protocol, Kerberos maybe.)
+You connect to the host and you can be sure it's really that host, no one is eavesdropping, all the good things.
+
+There are two problems with this.
+First, you are using Zookeeper because you don't want to care about what host is running which service.
+You certainly don't want to sign a new certificate for each one, deploy the private key to that host, etc.
+You can do this.
+It is possible.
+You can even automate it if you don't mind having an online CA, that is not only easier to abuse, but also limits your availability.
+
+The second, and even more important problem is _authenticating the wrong thing_.
+What if ZooKeeper lies to you?
+What if a compromised service publishes a hostname for some other service?
+You connect to that, verify that its certificate is correct, and proceed talking to the wrong service without noticing anything is wrong.
+Now, ZooKeeper is capable of controlling who can write what node, so you can create a structure like this:
+
+
+/services/foo-service/foo-service-1 = https://a.inthecloud.internal:6666
+/services/foo-service/foo-service-3 = https://b.inthecloud.internal:12345
+/services/bar-service/bar-service-0 = https://c.inthecloud.internal:6666
+/services/baz-service/baz-service-2 = https://d.inthecloud.internal:4444
+
+
+You have to set up the permissions so that no one can write /services, the user running foo-service can only write /services/foo-service, etc.
+This still doesn't help if Zookeeper itself is compromised.
+
+This way we must trust Zookeeper and the CA.
+
+# Authenticating service names
+
+There is a better way.
+We don't care about the hostname, the same way we don't care about the IP address.
+We don't sign certificates for IP addresses.
+We can sign a certificate for the service name, as in, CN=foo-service.
+Actually, we don't even have to sign it - the (self-signed) certificate can be included with the code of its clients.
+
+The main disadvantage of this approach is having to write custom certificate validation code, which I have done in Java.
+In Java it's actually pretty simple, the interfaces of interest are [X509KeyManager][keyman] and [X509TrustManager][trustman].
+Some of the methods relating to CAs will be simple stubs.
+There are "extended" versions of both, with more methods you don't need.
+I will publish the code, but I did this at work, and have not had time to reimplement it in the public domain.
+
+This way we don't have to trust Zookeeper, and we don't have to trust the CA either (we don't have one).
+The only thing we do have to trust is that the certificates included in the code are correct, but if someone can change that, they can change the code too.
+
+There is still the matter of deploying the private keys to the hosts, but now it can be the same one for each instance of the same service.
+This could be on a NAS, or scp'd to the local machine before starting the service that needs it.
+Obviously we also have to trust that the ACLs will protect the private key but this is no worse than the previous method.
+
+# Authenticating the client
+
+We must not forget to authenticate the client certificate as well.
+This is usually not done for browsers, but for inter-service traffic it is essential.
+You might want to use a different CN if the same service is sometimes the server and sometimes the client.
+Or you can use the same certificate but I don't recommend it.
+If they are different you can use the CA system for client authentication and use the embedded cert system for server authentication.
+Either way, this means you have to embedd the certificate of the client in the server code.
+
+There are all these certificates embedded everywhere.
+It doesn't sound too maintainable, but what's really going on here is each service consists of 3 files:
+
+- A server JAR that runs the server and doesn't contain any certs.
+- A client JAR that's a library imported by the clients, and contains the cert for the service.
+- A certificate, to be used for client authentication. (Or not, you could use a CA here.)
+
+It's not that bad.
+
+[keyman]: https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/X509KeyManager.html
+[trustman]: https://docs.oracle.com/javase/8/docs/api/javax/net/ssl/X509TrustManager.html
+[zk]: https://zookeeper.apache.org/
+[zksvc]: http://blog.arungupta.me/zookeeper-microservice-registration-discovery/
diff --git a/about.md b/about.md
index 17d5c92..e21d300 100644
--- a/about.md
+++ b/about.md
@@ -8,7 +8,7 @@ I am stribika.
I [write code](https://github.com/stribika) and I [tweet](https://twitter.com/stribika).
Also, [stackoverflow](https://stackoverflow.com/users/128514/stribika).
-* PGP fingerprint: `9AB5 E3A6 0AE3 F091 0B86 056F CFB7 F248 7B01 6D87` and [public key](/assets/rsa-pubkey-7B016D87.txt)
+* PGP fingerprint: `0406 629F F94F 92BF DEE5 FDA7 A11E 98D6 4B0F C61E` and [public key](/assets/rsa-pubkey-4B0FC61E.txt)
* OTR fingerprint: `4218BF59 537FED11 30D72874 423FECC4 75D849D8`
* BTC address: `18JbJ37A5VW5FKpbaXgfeAixSyVVac6fa4`
diff --git a/assets/NSA-Emails-About-Snowden-s-Concerns.pdf b/assets/NSA-Emails-About-Snowden-s-Concerns.pdf
new file mode 100644
index 0000000..7f2e142
Binary files /dev/null and b/assets/NSA-Emails-About-Snowden-s-Concerns.pdf differ
diff --git a/assets/no.png b/assets/no.png
new file mode 100644
index 0000000..8813a5d
Binary files /dev/null and b/assets/no.png differ
diff --git a/assets/rsa-pubkey-4B0FC61E.txt b/assets/rsa-pubkey-4B0FC61E.txt
new file mode 100644
index 0000000..de85ae5
--- /dev/null
+++ b/assets/rsa-pubkey-4B0FC61E.txt
@@ -0,0 +1,51 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+uEUm2KMgyAvYQH8Cfto=
+=WbNe
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/assets/rsa-pubkey-7B016D87.txt b/assets/rsa-pubkey-7B016D87.txt
deleted file mode 100644
index bbeb8cd..0000000
--- a/assets/rsa-pubkey-7B016D87.txt
+++ /dev/null
@@ -1,53 +0,0 @@
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: GnuPG v2
-
-mQINBFNmZQUBEADMFMg1Kcr5WQobo7JSSZBmmHq9FrwBkf048jQ5CazlTz37L+Tg
-OR3dZYn7FddsZ3K3Pepopb8lsJroPj0uGbUb21I9+bclkdbugoJBKqcWaAmxA7H/
-RggiPFTFvKs1emAfR1NHQYJpxUf0EPdIBcnXFAxnLzqwdHTV2qJr7V/cfGbS6vCG
-tDktP4o7lvuUvgINNXiZ7xpULQwziZZsMqwzZlsTvEEhV0Vql6VcldkQFMvedOFB
-HwZGYXb+drk5R10Ixk1KKpiuzu8S7KEbVc8JxWv2s7qhdqSaWrP+EbMpcWQ2ESpM
-XROdloFLOa4oKprkXmf9T1QHXp2cAX+HxFb/EvwvNnr4XbRGaVyJ8Arxb+Mm3pow
-yeDL3bPZfEecGbS9W3UtJ7lqJB2Vc7HdUdrY4LLByzWlVKizQXFN0OiApeaMTJHq
-o2/rIav5co+/r+wYtA25d5bw2Ez/gHKOpsGgVmlSm6Aau/0vI6fQiWrcS0Sw4XIa
-626LcjV7ByaKwrbKATbxmy9apHSrUHWqpgevvXGtriVZrZKXiCdekkjJP5YMsh/s
-ZT/0Yk1T1X7bEVQvgN+ci38qMsJkONEiV5T9TYyx0/j6qXyn0BeX1QYZQww0/5sd
-EYsuYKoTyxc/qMSRVER9gFe7l/0JjBxYwMvAn+v/oqLJjffUJRq1CK0ZaQARAQAB
-tGRTdHJpYmlrIEFuZHLDoXMgKFRoaXMgaXMgbXkga2V5LiBUaGVyZSBhcmUgbWFu
-eSBsaWtlIGl0LCBidXQgdGhpcyBvbmUgaXMgbWluZS4pIDxzdHJpYmlrYUBnbWFp
-bC5jb20+iQI/BBMBAgApBQJTZmUFAhsDBQkB4TOABwsJCAcDAgEGFQgCCQoLBBYC
-AwECHgECF4AACgkQz7fySHsBbYfxrg/+PtVW1S3hz+052OFAWULxXONSnbPtsqzu
-qQf6gWPMwBzz1+aeVolSjtTRzeEQjhE9sSBPWAhe7bS1P+tcvjDNuhmXeLpYMXKz
-1k0V+mr6rPIIVt9mmztPec6sAR7dSL8wkXYl/cqYowFUujP4pgoX9Couwh1wVSTU
-zdeZzC9/oeIQJNxb9hWnh3CKSQbIXuQxHNP/VGtDvEGFBlCLBcViVCCjofya5W5+
-stwvPaH8isTKMYI9WFoR4b3yNOVbAMYBChTHydwg7d8WDIw4mvUHe43hVIC1SdRF
-oTBRy/RjYgL/iNl/MAvwK9PsUvVvwkeExawOiQGHUiItP7bobtb78BCwVkZLLkTD
-Qy/1jfMeKC304UU2+5ULg8USxN0UmXcJi45mid8ZJxKppz0pRxBNWVpLLGMZWX6+
-kW2rVMBi61qs5IXa3oHINA+Ql88+rhdCDRCJviHS5uNB3Cg8NjokBUATdLoisr4l
-RPejSqAQxaIZguYeVKFyB1tx9RWRVt3r+kwbltIc++bpllT76Dc45CuM4ySYwwaB
-Ygdfz1Y3hPC7gbK6uk7ch2F3/xQOPTVaiw3oCPbR+LyLlMpTuxzbej08u8xvxDia
-vAgrBwmPa4KJUECRSa1mqeCYF7JV+LowObq1hZz9OXVeSr+V/FBx5Fkw6vSuXvBW
-2VqdidBcAci5Ag0EU2ZlBQEQAK27bA/oDAGa0LaWqp2Yoji5DLlVOlf/sXzcal/F
-j7aIX4HZAkMbBkz5pwzc5C+CyOjx0RFYbGxXD80XtEFbBY3GSE+ozF2gYjZYxzLs
-1WXYMAqOQ1RRtsRfKNvIvWafq2VW4Y4ABIRJI6TLHeg49dTudjWfhRQiV4n5/WJU
-DEEk8xfZD92z8R2t7htMGkTjHRqwcAq6zfnakM0mmbNIsG86S7JxOs0KFXttBMZc
-0z4dll4dbLkyCqysC0JSjlPreaeL8y9+uBocQmLuGHqZeTg6lpGJNjNoLO/RxZOW
-53y0UABtHY3riEFSzzZVOecT/LVLYcab31vVReZKRrBx/COItgSNdY0FrJjuQQQN
-b4E7tm2puNIOWP8MfHfFpsM/5BW8HcHmkGYg0VXGbouoqCeSMQ08Q5SSWdTqnvg9
-4OfB+tR+FHBHd0gOoh1GFB5Msy57ZMTmYY01aj5xn1zmNalFuj9fYGzy8U92VT2g
-9HtaiYAe56I40UCs+ys0qh3CauCfvsKpkEb3sPzgdGWJIFfLLo6euipoqkG3A1fz
-Q58t5rIMutAzbR3wV4wMdoccCktStPjYokvJ9DvedL2FJmXm0+Au1IajNfwZHNF4
-Bq2DEouVXsrXmNfVlQAc08AB3frcq8rQeEcPzNC//SqXu/K9GjQ+4ucyRL7cOCu/
-oht9ABEBAAGJAiUEGAECAA8FAlNmZQUCGwwFCQHhM4AACgkQz7fySHsBbYcjNw/9
-GFBOfV3eHrNd/3fMQih6hJ1vBW/7SyoQE/n4p4P4N1UvFuBIlbczFw3//tf6bL2d
-TSutaVuOhVOiWD7JCTJdYgTMhOjP29zmh1LSce+tIpN91Jzcl40y2kA2GmMxcZKK
-ehnUPaPkv9Y0sAZj5QyoCAqn97qRCPZsptTHXAeSEYbglERPuZAZA7MH8gXIsju+
-E5FLMDewHnnt7ekRUg3wS8bUoGDJMBDNkI/sNQoz0KPPvSLZOFvUqZgn6/E37AeZ
-1qvNBXE2u/kBIhdOK/VjDO+wjTblAqIWhXNOnC3u5ujrKU/R7+2leOfcW6XQFB2Z
-zYvH/Xo0S7SB740JxHZ/NubBDvLEx3Neac/zlsxxf0n/efbs3Oez0Umbx9eJJQgk
-QLNf017/HVZwGYeya5vE83VXvbGcfPNVCMGI4diuOY6q8kcn6fUbiJXzDrfo7EGV
-dRrHJ2R0MQUUE6s268ejoQ1PsSPDVKOJ0bMkZ9tby4JEr8XXxGQ/WppHa7vaXFin
-hOLa1Wv/Kmm7xptAa3ry/ScCOdznLYmEDH8mYLl7s0tg0W50kDfM6GZpU69PWvTP
-7h2aagQPwIF3JddtlRLJb5bAHt/LG52vafyYY45cKKA2ydywKNet9SWSKI4MzUjV
-ekOY1a7E3uLjK3iG4dBD+puBEx1Nh3ZL3pLhpN4YO5A=
-=H3+c
------END PGP PUBLIC KEY BLOCK-----
diff --git a/multi-code-widget.md b/multi-code-widget.md
new file mode 100644
index 0000000..bc4bc02
--- /dev/null
+++ b/multi-code-widget.md
@@ -0,0 +1,91 @@
+---
+layout: "no"
+permalink: /multi-code-widget/
+---
+
+
+
+blah blah
+
+Host *
+ Ciphers base64,rot13
+ MACs md5,crc32
+
+
+
+ Host *
+ Ciphers rot13
+ MACs md5
+
+
+
+ Host *
+ Ciphers base64
+ MACs crc32
+