title: Block ciphers, salt, AES, MySQL, and best practices around credential storage
body: <p>I have a situation where I must store a password, as I am building a system to connect to another system.  This other system only allows for a single user account, and the only way to connect to it is via a password.  A hash is not appropriate here.  I must store the password in a way that I can retrieve it.</p>
  
  <p>Now, with the knowledge that this is not a perfect system, I am trying to limit damage should someone get access to the database somehow.  As this database will need to be used by varying platforms, I have decided to use MySQL's own built-in encryption functions.  This way, I don't need to worry about finding compatible encryption/decryption algorithm implementations for various languages and systems.  I can just use MySQL's function in a query.</p>
  
  <p>When storing a password, I will use <code>AES_ENCRYPT("password", "encryption key")</code>.  Then I realized that I should probably use some salt so that if they were able to get one password, it would be harder to get others.  But wait!  What is the point?  If they are able to get one password, they must have the encryption key, yes?</p>
  
  <p>Besides, this is a block cipher.  Salts can be near-useless in some situations.</p>
  
  <pre><code>/* Returns 8CBAB2A9260975FF965E5A7B02E213628CBAB2A9260975FF965E5A7B02E21362FBB5D173CBAFA44DC406B69D05A2072C */
  SELECT HEX(AES_ENCRYPT("passwordpasswordpasswordpassword", "encryption key"));
  
  /* Returns 8CBAB2A9260975FF965E5A7B02E213628CBAB2A9260975FF965E5A7B02E21362C49AF8D5B194770E64FEF88767206391 */
  SELECT HEX(AES_ENCRYPT("passwordpasswordpasswordpassworda", "encryption key"));
  </code></pre>
  
  <h2>My Questions</h2>
  
  <ul>
  <li><p>Am I right in thinking that there is no reason to have a salt when using symmetrical encryption for situations like mine?</p></li>
  <li><p>Given that I <strong>must</strong> store a password in a way that allows me to retrieve the original value, are there any other methods I should be considering?  (I am aware that I need to be careful about where and how the encryption key is stored, and that I need to secure my MySQL logs as well.)</p></li>
  </ul>