Code Monkey home page Code Monkey logo

gpg-keygen's Introduction

gpg-keygen

A readme and a script to generate PGP keys using GnuPG, using the current best practices.

Its goal is to provide a concise and up-to-date description of best practices regarding the usage of GnuPG. A basic understanding of public key cryptography, and GnuPG in particular is assumed.

If something is not clear or you're new to PGP, then make sure to start with the Glossary below.

Some quick insights

  • Public key cryptography happens between two encryption keys, which is not necessarily only two humans, unless enough care has been taken when exchanging public keys and to keep the secret keys indeed secret.
  • In a digital networked world it's not possible to delete any published information, it must be assumed to be just there forever. This also applies to PGP keys.
  • Properly authenticated revocation requests can be published though. If such requests are digitally signed (authenticated), then they will be honored by programs using e.g. a PGP key (key servers, client programs), and the revoked data will be ignored/hidden from the user accordingly.
  • Having a separately stored revocation certificate in your backup comes very handy if your key gets compromised or lost. By publishing it you can tell your peers that your key should not be used anymore.
  • The most precious part of a PGP key block is its master signing key.
  • The master signing key of a PGP key block is rarely needed (mostly when editing the PGP key block itself and when signing other people's keys).
  • If you don't trust the software environment and/or the computer generating or using your gpg key, then you cannot trust the key and the cryptography either. Opensource is a minimum in security, so use a Linux live cd or something similar from a trusted source to generate and/or use your master signing key, preferably while being offline (see live CD's in the Glossary)!
  • Specialized hardware solutions offer much better protection for secret keys.
  • If you forget the passphrase for your already published key, and you don't have a revocation certificate, then your key will be lingering on the keyservers confusing your peers, who will annoy you by sending you messages you cannot read.
  • Passphrases: three to five word long sentences (based on a non-trivial vocabulary, preferably with s0me typ0s) are easier to remember than a bunch of random characters, and are better passphrases. You can even build a little story around them to have separate but semantically interconnected passphrases (for the keys, for the revocation certificate, etc.). A vivid dream or delightful fantasies can be a good basis for something you won't forget... :)
  • ...but at the end of the day it'll always be a tradeoff between security and convenience. Assess your risks and act accordingly.

The PGP algorithm needs an extra parameter, a key, to sign or encrypt data. That parameter is a cryptographic keypair, usually one of the subkeys from a PGP key block. New subkeys can be freely generated and published, so forward secrecy can be achieved by publishing new subkeys, as long as the secret part of the master signing keypair has not been compromised. Therefore the most precious part of a PGP key block is its master signing key, because whenever new information is attached to the key block (e.g. a new subkey is generated), this new data must be signed by the secret part of the master signing keypair, otherwise conforming programs will reject the new unsigned or improperly signed part of the PGP key block. This way only that person can publish valid additions to the key block who controls the secret part of the master signing key.

So, in short: keep the secret part of your master signing key safe!

Generating a key

The aim is to generate a digital identity that can serve to identify you and to facilitate secret communication with you in the future.

Things to consider:

  • Longer signing keys generate longer signatures.
  • RSA signatures are longer than DSA signatures (but there's more to this story).
  • If a valid signing subkey exists, then the master signing key is rarely used (only to sign internal parts of the key block, or when explicitly selected), so the size of the signatures it generates is not a major concern.
  • Having a strong master signing key (and taking good care of it) can provide a long time span for your digital identity (possibly 10+ years) and for forward secrecy.
  • It's possible to generate 8192 bit RSA signing keys (by using batch mode, as this script does for the master key).
  • Some GnuPG configuration parameters affect newly generated keys (although not in a permanent way). See setperf to set the preferred hash algorithms for identities e.g. here.

Even more thoughts here.

Using GnuPG

GnuPG properly operates with a PGP key block that is missing the secret part of its master signing key, as long as it's not needed for an operation. Therefore it's a good idea not to store the secret part of the master signing key in the regularly used gpg home directory, but rather generate and handle it in a safer environment; e.g. generate and handle it using a live CD without Internet connection, and store it on a pendrive dedicated to this purpose. Then only attach it when needed (e.g. when signing other people's keys or when your own keyblock needs to be modified).

This script generates (with defaults in parens):

  • a master signing key (RSA 8192 bit, never expires)
  • a subkey for signing (RSA 4096 bit, 3 years)
  • a subkey for encryption (RSA 2048 bit, 3 years)
  • export the secret part of the master signing key into the file secret-master-key.gpg
  • export the secret parts of the two generated subkeys into the file secret-subkeys.gpg
  • export the public parts of all the three generated keys into the file public-keys.gpg
  • generate and symmetrically encrypt a revocation certificate into the file revocation-certificate-for-[keyid]-passphrase-protected.gpg
  • (planned: support for ssss-split to generate secret sharing to backup the master key and the revocation certificate in a distributed manner)

Once the exported files have been generated, you can import them into the gpg homedir's on your devices (by default ~/.gnupg). Where you should import and what depends on the level of security you want to achieve, but keeping the master key offline is advised as described above.

    $ gpg --import secret-subkeys.gpg public-keys.gpg
    $ gpg --list-secret-keys
    ---------------------------------
    sec#  8192R/ABCD1234 2010-01-01
    uid                  John Doe <[email protected]>
    ssb   4096R/42AA42AA 2010-01-01 [expires: 2013-01-01]
    ssb   2048R/41BB41BB 2010-01-01 [expires: 2013-01-01]

(the '#' character in the output shows that the secret part of the master signing key is missing)

SmartCards and other hardware keys

SmartCards and USB cryptographic tokens are specialized computers that perform cryptographic operations. They are designed to keep the secret keys secret even against physical attacks. They are much more secure than storing a key on a computer, but are not flawless ⁽¹⁾ ⁽²⁾. Usually they can store three separate keys for signing, encryption, and authentication, and the secret keys can be either uploaded or generated on the cards.

Some laptops have internal smart card readers, and higher security external readers have their own PIN entry keyboard.

Further information on using smart cards on Linux: Debian wiki, Using an OpenPGP SmartCard, OpenSC – tools and libraries for smart cards, GnuPG wiki.

Glossary

  • PGP key - It's usually a shorthand for PGP key block, which will be the case in this document, too. Not to be confused with asymmetric cryptographic keypairs, which are merely parts of PGP key blocks.
  • PGP key block - a complex structure of information (normally stored in ~/.gnupg/). Examples of the information it can contain: multiple cryptographic (sub)keys; multiple identities (email addresses, photgraphs, etc); digital signatures on various parts of the key block (potentially made by other people's keys, e.g. to communicate the belief to the rest of the world that the same real world person owns the listed digital identities, and also the secret part of the key).
  • subkey - PGP key blocks can have, among other things, multiple asymmetric cryptographic keypairs. One such asymmetric cryptographic keypair is mandatory for normal operation. It's called the master signing key, and it's used to sign various information inside the key block, e.g. identities and/or other cryptographic keys, which are called subkeys.
  • asymmetric cryptographic keypair - they are basically pairs of very big interconnected random numbers, one of them should be made public, while the other one should be kept secret. Asymmetric encryption algorithms use the public part to encrypt data and to verify signature blocks, while use the secret part to decrypt data and to generate signature blocks.
  • OATH is short for Initiative for Open Authentication. Among other things it defines a Time-based One-time Password (TOTP) authentication standard, supported by more and more websites.
  • Live CD is a bootable read-only operating system, like these security focused Linux Live CDs (bootable from USB pendrives also):

Alternatives and/or further reading

Credits

Written by Attila Lendvai [email protected] (Key fingerprint: 2FA1 A9DC 9C1E BA25 A59C 963F 5D5F 45C7 DFCD 0A39).

If you've found this useful, then tips are welcome:

  • Bitcoin (BTC): 1Ej8SeMNTkwjSwhKLu7H1XLVRPZ3HUjM4J (0 BTC as of 2014-01-18)
  • Ripple (XRP): r33NEgyd7HqvrUeB98rQ4VoBxP438gC74Q (0 XRP as of 2014-01-18)
  • Paypal: (0 USD as of 2014-01-18)

gpg-keygen's People

Contributors

attila-lendvai avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.