README.md in urlcrypt-0.0.1 vs README.md in urlcrypt-0.1.0

- old
+ new

@@ -1,53 +1,93 @@ # URLcrypt +[![Build Status](https://travis-ci.org/madrobby/URLcrypt.png?branch=master)](https://travis-ci.org/madrobby/URLcrypt) + Ever wanted to securely transmit (not too long) pieces of arbitrary binary data -in a URL? *urlencrypt* makes it easy! +in a URL? **URLcrypt** makes it easy! -This gem is based on the base32 gem from Samuel Tesla. +This gem is based on the [base32](https://github.com/stesla/base32) gem from Samuel Tesla. -URLcrypt uses a 256-bit AES symmetric encryption to securely encrypt data, and -and encodes and decodes Base 62 strings that can be used directly in URLs. +URLcrypt uses **256-bit AES symmetric encryption** +to securely encrypt data, and encodes and decodes +**Base 32 strings that can be used directly in URLs**. -For example, this can be used to securely store user ids and the like when you -access a web application from a place that doesn't have other authentication -mechanisms, like when you load an image in an email. +This can be used to securely store user ids, download expiration dates and +other arbitrary data like that when you access a web application from a place +that doesn't have other authentication or persistence mechanisms (like cookies): + + * Loading a generated image from your web app in an email + * Links that come with an expiration date (à la S3) + * Mini-apps that don't persist data on the server -URLcrypt uses a modified Base 32 algorithm that doesn't use padding characters, -and doesn't use vowels to avoid bad words in the generated string. +Works with Ruby 1.8, 1.9 and 2.0. -The main reason why Base 32 is useful is that Ruby's built-in Base 64 support -is, IMO, looking ugly in URLs and requires several characters that need to be -URL-escaped. +**Important**: As a general guideline, URL lengths shouldn't exceed about 2000 +characters in length, as URLs longer than that will not work in some browsers +and with some (proxy) servers. This limits the amount of data you can store +with URLcrypt. -Unfortunately, some other gems out there that in theory could handle this -(like the radix gem) fail with strings that start with a "\0" byte. +**WORD OF WARNING: THERE IS NO GUARANTEE WHATSOEVER THAT THIS GEM IS ACTUALLY SECURE AND WORKS. USE AT YOUR OWN RISK.** -*WORD OF WARNING* THERE IS NO GUARANTEE WHATSOEVER THAT THIS GEM IS ACTUALLY -SECURE AND WORKS. USE AT YOUR OWN RISK. +Patches are welcome; please include tests! -Note: this is version 0.0.1 which doesn't actually come with the encryption part -just yet. It will only work on Ruby 1.8.7 for now. - -Patches are welcome, please include tests. - ## Installation Add the `urlcrypt` gem to your Gemfile. ## Simple Example ```ruby +# encrypt and encode with 256-bit AES +# one-time setup, set this to a securely random key with at least 256 bits, see below +URLcrypt::key = '...' + +# now encrypt and decrypt! +URLcrypt::encrypt('chunky bacon!') # => "sgmt40kbmnh1663nvwknxk5l0mZ6Av2ndhgw80rkypnp17xmmg5hy" +URLcrypt::decrypt('sgmt40kbmnh1663nvwknxk5l0mZ6Av2ndhgw80rkypnp17xmmg5hy') + # => "chunky bacon!" + +# encoding without encryption (don't use for anything sensitive!), doesn't need key set URLcrypt.encode('chunky bacon!') # => "mnAhk6tlp2qg2yldn8xcc" URLcrypt.decode('mnAhk6tlp2qg2yldn8xcc') # => "chunky bacon!" ``` +### Generating keys + +The easiest way to generate a secure key is to use `rake secret` in a Rails app: + +``` +% rake secret +ba7f56f8f9873b1653d7f032cc474938fd749ee8fbbf731a7c41d698826aca3cebfffa832be7e6bc16eaddc3826602f35d3fd6b185f261ee8b0f01d33adfbe64 +``` + +To use the key with URLcrypt, you'll need to convert that from a hex string into a real byte array: + +``` +URLcrypt::key = ['longhexkeygoeshere'].pack('H*') +``` + ## Running the Test Suite If you want to run the automated tests for URLcrypt, issue this command from the distribution directory. - % rake test:all +``` +% rake test:all +``` + +## Why not Base 64, or an other radix/base library? + +URLcrypt uses a modified Base 32 algorithm that doesn't use padding characters, +and doesn't use vowels to avoid bad words in the generated string. + +The main reason why Base 32 is useful is that Ruby's built-in Base 64 support +is, IMO, looking ugly in URLs and requires several characters that need to be +URL-escaped. + +Unfortunately, some other gems out there that in theory could handle this +(like the radix gem) fail with strings that start with a "\0" byte. + ## References * Base 32: RFC 3548: http://www.faqs.org/rfcs/rfc3548.html \ No newline at end of file