BTW, 以前者也是我和 @nowazhu 完全靠 GTalk 语音和文字来沟通,搞出来的
Skype 看着就累
干这个事情的人好多啊!
我重来都不信任 .rvmrc 是个靠谱的方案,还是手动指定心里安心
之前的喜欢数据我是转进收藏里面了的
#15 楼 @lin_style form_tag 生成的 name="event[name]" 是更根据 @event1 的类名来的,跟你去什么对象名称没有关系。
更新内容都有什么啊?
我也想知道
查看 HTML 源代码
<input name="event[name]" />
就是把这个 name 里面的东西转换过来的。
@donnior 这个是支付宝的某个接口的数据校验方式
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 字符"))
我一些理解:
# 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.key
和 dsa.pem
,ca.key
是私钥文件,可以直接读出来给 key = OpenSSL::PKey::DSA.new(File.read("ca.key"))
得到 dsa 对象,同时这个时候用 key.public_key 就可以看到公钥。
刚才找会 Java 的同事来帮我把 Java 的算法编译出来跑,把 Ruby 的结果放进去测试,结果对了。对应最上面 Java 的算法的 Ruby 写法就是 #10 楼 希望以后可以帮助到其他同学参考。
最新的进展,我发现只用 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 看看能否跑起来
我也捐了 $20,用了 Rails 这么久了,帮我带来的东西比这个值多了,是时候出手回报了。
现在是 7 天的,确实太长了。
我是一直
scope :by_level, Proc.new { |level| where(:level => level) }
之前 ytrip 那个项目我试过 cache_fu, cache-money 最后我还是自己实现了一个,全自动的 cache 和 过期处理,并且还会将 List 结果拆出来,细化存下去,这样单个数据的和 List 的查询可以公用一个 cache,减少无谓的过期清理,提高命中率。
以前一直以为杭州空气质量很好,看了这个数据才发现,我错了。
现在 Go 的生态环境发展得如何了?很有前景的东西。
WOW
有个 gem 叫 PythonRuby 还是 RubyPython 的。