代码之家  ›  专栏  ›  技术社区  ›  Tom Andersen

Ruby-加密\字符串

  •  1
  • Tom Andersen  · 技术社区  · 16 年前

    这里有点像红宝石新手-应该是个简单的问题: 我想使用加密字符串gem创建密码加密字符串: (从 http://rdoc.info/projects/pluginaweek/encrypted_strings )

    问题是:一切正常,但是 为什么我不需要密码来解密字符串? 比如说,我想将字符串存储一段时间,比如会话。密码是否也与它一起存储?(哪一个看起来很奇怪?)不,我不打算使用“秘密密钥”或任何类似的黑客作为密码。

    我计划使用UUID动态生成一个类变量@@password,它不是存储在内存中,可以从程序的一个运行状态更改为下一个运行状态。

    对称的:

    >> password = 'shhhh'
     => "shhhh"
     >> crypted_password = password.encrypt(:symmetric, :password => 'secret_key')
     => "qSg8vOo6QfU=\n"
      >> crypted_password.class
     => String
     >> crypted_password == 'shhhh'
     => true
     >> password = crypted_password.decrypt
     => "shhhh"
    
    2 回复  |  直到 16 年前
        1
  •  2
  •   Mark Rushakoff    16 年前

    用一个 对称的 加密方案,您只需要相同的密码进行加密和解密。从外观上看,密码存储在加密字符串上的实例变量中:

    >> secret = '123'
    => "123"
    >> crypted = secret.encrypt(:symmetric, :password => "password")
    => "R5RVA511Nzw=\n"
    >> crypted.instance_variables
    => ["@cipher"]
    >> crypted.instance_variable_get("@cipher")
    => #<EncryptedStrings::SymmetricCipher:0x101192768 @password="password", @algorithm="DES-EDE3-CBC">
    

    所以是的,如果你把 crypted 如上所述,您还将存储密码。这样做的目的是只存储 隐匿的 没有实例变量。我想 crypted.to_s String(crypted) 可以做到这一点,但都不行。作为解决方法,可以对其进行字符串插入,并将其显式传递给 String#new ,或显式删除实例变量:

    >> "#{crypted}".instance_variables
    => []
    >> String.new(crypted).instance_variables
    => []
    >> crypted.send :remove_instance_variable, :@cipher
    => #<EncryptedStrings::SymmetricCipher:0x101192768 @password="password", @algorithm="DES-EDE3-CBC">
    >> crypted.instance_variables
    => []
    

    一旦您只有字符串内容,您可以稍后使用密码对其进行解密:

    >> "R5RVA511Nzw=\n".decrypt(:symmetric, :password => "password")
    => "123"
    
        2
  •  1
  •   Tom Andersen    16 年前

    好吧-下面是我自己的问题:

    • 再次感谢标记控制台代码。这让我想到:

    你应该 使用string.new()方法从加密的 一个用于外部存储:

    我认为这有点奇怪,也有点危险,即当一个字符串被加密时,默认行为是在字符串中包含密码。

    Loading development environment (Rails 2.3.8)
    >> secret = '123'
    => "123"
    >> require 'encrypted_strings'
    => []
    >> crypted = secret.encrypt(:symmetric, :password => "password")
    => "R5RVA511Nzw=\n"
    >> crypted.instance_variables
    => ["@cipher"]
    >> crypted.instance_variable_get("@cipher")
    => #<EncryptedStrings::SymmetricCipher:0x101c58b20 @algorithm="DES-EDE3-CBC", @password="password">
    // note that this .to_s only passes back the crypted, since crypted _is_ a string.
    >> someString = crypted.to_s 
    => "R5RVA511Nzw=\n"
    >> someString.instance_variables
    => ["@cipher"]
    >> crypted.instance_variable_get("@cipher")
    => #<EncryptedStrings::SymmetricCipher:0x101c58b20 @algorithm="DES-EDE3-CBC", @password="password">
    >> plainString = String.new(crypted)
    => "R5RVA511Nzw=\n"
    >> plainString.instance_variables
    => []
    >> crypted.class
    => String
    >> plainString.decrypt
    ArgumentError: Cipher cannot be inferred: must specify it as an argument
        from /Library/Ruby/Gems/1.8/gems/encrypted_strings-0.3.3/lib/encrypted_strings/extensions/string.rb:98:in `decrypt'
        from (irb):14
    >> plainString.decrypt(:symmetric, :password => "password")
    => "123"