• BTW, 以前者也是我和 @nowazhu 完全靠 GTalk 语音和文字来沟通,搞出来的

  • Skype 看着就累

  • TextMate 团购 (第一期) at 2012年03月31日

    干这个事情的人好多啊!

  • 我重来都不信任 .rvmrc 是个靠谱的方案,还是手动指定心里安心

  • 之前的喜欢数据我是转进收藏里面了的

  • #15 楼 @lin_style form_tag 生成的 name="event[name]" 是更根据 @event1 的类名来的,跟你去什么对象名称没有关系。

  • GitCafe 新版本上线 at 2012年03月30日

    更新内容都有什么啊?

  • 数据库异地提速? at 2012年03月30日

    我也想知道

  • 查看 HTML 源代码

    <input name="event[name]" />
    
    

    就是把这个 name 里面的东西转换过来的。

  • @donnior 这个是支付宝的某个接口的数据校验方式

  • #15 楼 @chitsaou Java 的 privateKey 那个我现在还在研究这么形成 DSA 对象,publicKey 是可以,但是 privateKey 不行,会提示 Neither PUB key nor PRIV key

  • Rails 3.1.2 has been released at 2012年03月30日

    #10 楼 @scott 在 Gemfile 里面加上 thin

    gem "thin"
    
    

    然后 rails s 启动就会用 thin 来跑,就不会有那个提示了。

  • 反过来验证来之 Java 的 sign

    Java 会提供 public_key, sign, 和需要明文数据 data,以楼顶上面的 Java 例子为例

    public_key = "MIIBtjCCASsGByqGSM44BAEwggEeAoGBAMMai0rQ+0dTbXjJhesuXbnAIX8bOQAWPG3cv5VDjSUPK5alJWKqtlDrkR2qn+gOKHZELZEhUNX+Zej0x2fRfYMaQ8/GoCm/PUZ79irt/+dg9pkkhUBQ+gPAcpt8vGA/VJHlExgd/vTXiCJyslJFlP6W34rnAnO9lZTIAwF9kXNFAhUA8I+b9ZS1MoHketM8YGPLqR/s3uECgYA+ZqrPhRW5BwOpb46c0x11tAOryfGWrByYYWb6ONjTTKCA1vVcCYEdBr6gNr8noO+xRsUtvlZ2Mar0xi9kwYr2CWBr/bFcvhvjRx7e24s6oC0AGpuwgTFjUkb7LkYcM7tyemLOmCs+Ir8gx+OXjC3ukFWawFnJtbB4BfH81Tk5ZAOBhAACgYAtBXiK0XxLdhqhk2u/lh/xMpGIzlgAp+recKY9DHZI+DQidhFMNrAxzw3ptlKfV4jZeDallOMWe55m/Dn6EmP74BPzot1i+Pcz3VvQ0W5ts1QrR6A1w/STwP9RXKWERnV+YjMhyzWx39E9cDxeZMo0zonlqTjYAPI4+kDVhjU4uQ=="
    
    

    Ruby 用 OpenSSL::PKey::DSA.new 传入 public_key 是可以得到公钥的对象,然后用来 sysverify,可是 Java 提供的那个 public_key 实际上是被 Base64 加密过的,需要解一下再能给 OpenSSL::PKey::DSA.new

    require "base64"
    require "openssl"
    # 上面的 public_key 反解 base64 以后得到的是个 DER 类型([Ruby DSA 文档里面](http://ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/PKey/DSA.html) 有说 new 是可以接受 DER 格式的
    public_der = Base64.decode64(public_key)
    pub_key = OpenSSL::PKey::DSA.new(public_der)
    pub_key.sysverify(OpenSSL::Digest::DSS1.digest(input_str),Base64.decode64("Java 给的 sign 字符"))
    
    
    
  • 我一些理解:

    DSA 生成过程

    # 1.先生成dsa参数
    # openssl dsaparam -rand -genkey -out dsa.pem 1024
    # 查看生成的DSA参数
    # openssl dsaparam -noout -text -in dsa.pem
    # 2.根据生成的DSA参数来生成DSA密钥
    # openssl gendsa -des3 -out ca.key dsa.pem
    # 查看DSA密钥
    # openssl dsa -noout -text -in ca.key
    
    

    上面会生成两个文件 ca.keydsa.pemca.key 是私钥文件,可以直接读出来给 key = OpenSSL::PKey::DSA.new(File.read("ca.key")) 得到 dsa 对象,同时这个时候用 key.public_key 就可以看到公钥。

  • 刚才找会 Java 的同事来帮我把 Java 的算法编译出来跑,把 Ruby 的结果放进去测试,结果对了。对应最上面 Java 的算法的 Ruby 写法就是 #10 楼 希望以后可以帮助到其他同学参考。

  • #5 楼 @lgn21st 本来一开始天 100 的,后面一算,都 600 多了,老婆知道了一定会发火了,然后就改成了 20,100 多没什么

  • 最新的进展,我发现只用 private_key 来进行加密和验证加密是可以的

    # coding: utf-8
    require "rubygems"
    require "base64"
    require "cgi"
    require "openssl"
    
    
    # 1.先生成dsa参数
    # openssl dsaparam -rand -genkey -out dsa.pem 1024
    # 查看生成的DSA参数
    # openssl dsaparam -noout -text -in dsa.pem
    # 2.根据生成的DSA参数来生成DSA密钥
    # openssl gendsa -des3 -out ca.key dsa.pem
    # 查看DSA密钥
    # openssl dsa -noout -text -in ca.key
    
    params = {
      :_input_charset => "utf-8",
      :partner => "2088101115793806",
      :sns_user_id => "12345",
      :a => "1",
      :z => "z1",
      :sign_type => "DSA",
      :sign => "SEcr/GJlGSEMF2QX6J3ictLEPLG+ygG++Peq+DAuIg3qNE1P5kYmoA=="
    }
    
    # 排序后待签名的串
    params.delete(:sign_type)
    params.delete(:sign)
    input_str = params.sort.collect do |s|
      unless s[0] == "notify_id"
        [s[0],CGI.unescape(s[1])].join("=")
      else
        [s[0],s[1]].join("=")
      end
    end.join("&")
    
    
    # Encoding
    priv_key = OpenSSL::PKey::DSA.new(File.read("/Users/jason/ca.key"),"1234")
    puts priv_key
    puts priv_key.public_key
    sign = Base64.encode64(priv_key.syssign(OpenSSL::Digest::DSS1.digest("ruby")))
    puts sign.inspect
    
    # Decoding
    puts priv_key.sysverify(OpenSSL::Digest::DSS1.digest("ruby"),Base64.decode64(sign))
    
    
    -----BEGIN DSA PRIVATE KEY-----
    MIIBuwIBAAKBgQDm9DUtw99CIYscVHMcHpffdE4hghQweiS72FjFHs4GarmnE6Ul
    YfmbQdm7WWaEbASWZwMH5pBbm6pDSEPrsCxmZMhwphllXa0qI+UWVvDrjcZLP1KF
    pYwtNYND7RiWv6L8xGg43QAjLHhA88lTQb5ONSXsyaVnUhZu77Sa7lzLNwIVAKrO
    mPOOcQP3a3Mb0uMkD16kAFnnAoGACjAmqtPh5peu84TtmIk8Zso0xs48OSaJzpYc
    y/o/CLx4ZsurAY0z2WbaZLY/XWiBlj2EsA+FgZjeQvekAm6QjHEKzGu1KZntGlWP
    TD7uv5D5QI9PD+YaHzQ9Umr5o6I8BizFvu/dXuXuGzGGm/FdYdHIPpW84WagzoBi
    GZ6lvBUCgYBm4/CUmIptuBBWGF8MMywW0p7mx25EhQMWH7cLvG+fUbxKZXZMNclk
    YQfQWpBG27SlFStJv8P/UzOqSYg//GY5CdurPf+OawPNNLE9NATp8SrcBZ/pTbOy
    fVdQBBpAHdQoWaUByNS0V1SdGN1GNzRSPzzApAAYXMB7tHjyjoJW4QIVAJ2UAT/G
    K6mIyQp1o4k/RWAq3Izr
    -----END DSA PRIVATE KEY-----
    -----BEGIN PUBLIC KEY-----
    MIIBtjCCASsGByqGSM44BAEwggEeAoGBAOb0NS3D30IhixxUcxwel990TiGCFDB6
    JLvYWMUezgZquacTpSVh+ZtB2btZZoRsBJZnAwfmkFubqkNIQ+uwLGZkyHCmGWVd
    rSoj5RZW8OuNxks/UoWljC01g0PtGJa/ovzEaDjdACMseEDzyVNBvk41JezJpWdS
    Fm7vtJruXMs3AhUAqs6Y845xA/drcxvS4yQPXqQAWecCgYAKMCaq0+Hml67zhO2Y
    iTxmyjTGzjw5JonOlhzL+j8IvHhmy6sBjTPZZtpktj9daIGWPYSwD4WBmN5C96QC
    bpCMcQrMa7Upme0aVY9MPu6/kPlAj08P5hofND1SavmjojwGLMW+791e5e4bMYab
    8V1h0cg+lbzhZqDOgGIZnqW8FQOBhAACgYBm4/CUmIptuBBWGF8MMywW0p7mx25E
    hQMWH7cLvG+fUbxKZXZMNclkYQfQWpBG27SlFStJv8P/UzOqSYg//GY5CdurPf+O
    awPNNLE9NATp8SrcBZ/pTbOyfVdQBBpAHdQoWaUByNS0V1SdGN1GNzRSPzzApAAY
    XMB7tHjyjoJW4Q==
    -----END PUBLIC KEY-----
    "MC0CFQCHbZLZU+3JngAkVg//2Uh803IriwIUTaHLHp8LOiyjzYrjIuzO4n8E\n8kY=\n"
    true
    
    

    看起来似乎是通了,给 Java 那边的 public_key 原来是从 priv_key.public_key 出来的,而不是 dsa.pem,我之前一直理解错了... 具体还得用 Java 跑起来测试看对不对,希望能通过,不想在折腾了。

  • 手动 rails s -e production 看看能否跑起来

  • #3 楼 @daqing openssl_pkcs8 是 for RSA 而不是 DSA

  • @daqing @donnior @chitsaou 这个 Java 的加密方式和 Ruby DSA 类接受的格式是不同的,我补充了一下 private_key 的格式,看正文。

  • #6 楼 @daqing private_key 不是一个简单的 DSA 密钥,似乎是经过 DES3 加密的

  • 我也捐了 $20,用了 Rails 这么久了,帮我带来的东西比这个值多了,是时候出手回报了。

  • 现在是 7 天的,确实太长了。

  • 如何让 scope 可以携带参数 at 2012年03月30日

    我是一直

    scope :by_level, Proc.new { |level| where(:level => level) }
    
    
  • 之前 ytrip 那个项目我试过 cache_fu, cache-money 最后我还是自己实现了一个,全自动的 cache 和 过期处理,并且还会将 List 结果拆出来,细化存下去,这样单个数据的和 List 的查询可以公用一个 cache,减少无谓的过期清理,提高命中率。

  • 浙江各城市 PM2.5 监测数据 at 2012年03月30日

    以前一直以为杭州空气质量很好,看了这个数据才发现,我错了。

  • go version 1 is released at 2012年03月29日

    现在 Go 的生态环境发展得如何了?很有前景的东西。

  • 日本女人的 Rubyist at 2012年03月29日

    WOW

  • python 和 ruby 可以混用吗? at 2012年03月29日

    有个 gem 叫 PythonRuby 还是 RubyPython 的。