Forum: Ruby on Rails Storing encrypted strings in MYSQL - encrypted data changes on DB store

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
2dddec0f7717cae77ac6bceede6be5bc?d=identicon&s=25 Ram (Guest)
on 2009-03-03 11:38
(Received via mailing list)
Im trying to encrypt a string and store it in the DB. But there seems
to be some interpretation problems both in Ruby and in MySQL. Here's
what Ive tried and the results.. (the data to be encrypted is the
string "1231821029")

#Crypt MODULE has

  def AESCrypt.decrypt(encrypted_data, key, iv, cipher_type="aes-256-
cbc")
    aes = OpenSSL::Cipher::Cipher.new(cipher_type)
    aes.decrypt
    aes.key = key
    aes.iv = iv if iv != nil
    aes.update(encrypted_data) + aes.final
  end

  def AESCrypt.encrypt(data, key, iv, cipher_type="aes-256-cbc")
    aes = OpenSSL::Cipher::Cipher.new(cipher_type)
    aes.encrypt
    aes.key = key
    aes.iv = iv if iv != nil
    aes.update(data) + aes.final
  end


#Raising the encrypted data after form submit and before save in yaml
format

"\x8E\xEDP\xB4&U\xA6\xDA[\xCC\xFD\xB11m\xDB\x14"

#Console tests

>> x = AESCrypt.encrypt("1231821029", "X"*32, "I"*32)
=> "\216?P?&U\246?[??\2611m?"
>> y = AESCrypt.decrypt("\216?P?&U\246?[??\2611m?", "X"*32, "I"*32)
OpenSSL::CipherError: wrong final block length
  from /Users/fire/Sites/Vinay/ROR/RealApps/fi_rest_auth/config/
initializers/aes_crypt.rb:20:in `final'
  from /Users/fire/Sites/Vinay/ROR/RealApps/fi_rest_auth/config/
initializers/aes_crypt.rb:20:in `decrypt'
  from (irb):3
>> y = AESCrypt.decrypt(x, "X"*32, "I"*32)
=> "1231821029"
>> y = AESCrypt.decrypt("\x8E\xEDP\xB4&U\xA6\xDA[\xCC\xFD\xB11m\xDB\x14", "X"*32, "I"*32)
=> "1231821029" # notice the string i used here is the one i raised
before save. that too, works. although it is different from what the
console returns for the encrypt function.
>> x
=> "\216?P?&U\246?[??\2611m?"

#Encrypted data stored in DB

??P?&U??[???1m?

even the SQL insert call has ??P?&U??[???1m? if I check the logs.
Im basically getting 3 different values at 3 different points for the
same encrypted data. ie.

before_save - "\x8E\xEDP\xB4&U\xA6\xDA[\xCC\xFD\xB11m\xDB\x14"
after_save in DB - ??P?&U??[???1m?
in the console - "\216?P?&U\246?[??\2611m?"

And when i try to decrypt using whats there in the DB, I get "bad
decrypt - wrong final block length".

Any idea what im missing here? Ive done some serious digging and ive
hit bedrock and no water. Hoping someone here's got the answer.

Cheers!
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2009-03-03 11:52
(Received via mailing list)
On 3 Mar 2009, at 10:37, Ram wrote:

>
> Im trying to encrypt a string and store it in the DB. But there seems
> to be some interpretation problems both in Ruby and in MySQL. Here's
> what Ive tried and the results.. (the data to be encrypted is the
> string "1231821029")
>

Watch out for the type of the column you are storing the data in - if
it is a text column with encoding utf8 mysql will truncate if it
encounters an invalid utf8 sequence.

Fred
2dddec0f7717cae77ac6bceede6be5bc?d=identicon&s=25 Ram (Guest)
on 2009-03-03 11:59
(Received via mailing list)
the encoding IS indeed utf8 and the column is a string column (varchar
255). how can I correct this?

On Mar 3, 3:51 pm, Frederick Cheung <frederick.che...@gmail.com>
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2009-03-03 12:08
(Received via mailing list)
On 3 Mar 2009, at 10:58, Ram wrote:

>
> the encoding IS indeed utf8 and the column is a string column (varchar
> 255). how can I correct this?

make the column by BINARY, VARBINARY or BLOB or you could base64 the
data before you store it.

Fred
2dddec0f7717cae77ac6bceede6be5bc?d=identicon&s=25 Ram (Guest)
on 2009-03-03 13:02
(Received via mailing list)
Hi Fred,

I changed the column type to blob by changing the column def in the
migration to :binary (which translates into blob in mysql).
but the data in the DB still gets stored in the same way. ie ??P?&U??
[???1m?

I havent changed the encoding setting in database.yml from utf8. Do i
have to change that?

Or can you explain what you meant by I could base64 before storing?
I really am not able to make head or tail of the whole cryptography
arena..
thanks for the help..



On Mar 3, 4:07 pm, Frederick Cheung <frederick.che...@gmail.com>
This topic is locked and can not be replied to.