我希望能够对用户发送到我的应用程序的电子邮件进行身份验证。为了简单起见,我只能为 gmail 用户这样做,因为 gmail 使用 DKIM 对所有外发电子邮件进行签名。
如何找出 gmail 的 DKIM 公钥?我尝试使用http://www.protodave.com/tools/dkim-key-checker/,但找不到 gmail 的选择器名称。
然后我如何验证消息的真实性?HMAC?是否有一些 API/服务可以做到这一点?
我希望能够对用户发送到我的应用程序的电子邮件进行身份验证。为了简单起见,我只能为 gmail 用户这样做,因为 gmail 使用 DKIM 对所有外发电子邮件进行签名。
如何找出 gmail 的 DKIM 公钥?我尝试使用http://www.protodave.com/tools/dkim-key-checker/,但找不到 gmail 的选择器名称。
然后我如何验证消息的真实性?HMAC?是否有一些 API/服务可以做到这一点?
我从 Gmail 向另一个帐户发送了一封测试邮件,然后查看了 DKIM 信息的标题。我有:
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=gmail.com; s=20120113;
h=mime-version:x-received:date:message-id:subject:from:to
:content-type; bh=fd9JXP6Ngw+hgcG1EbBo7GpsrIIZzdJb9Q/14o9e5C8=;
b=sYlJC2oYWzBUOPIo0jtR4iFsIVqUlwo2QRcG1186hg5ai0oO1nisiOJUD+QXjt (snip)
这里的选择器是“20120113”。在 shell 提示符下,向 Google 的 DNS 查询与该选择器关联的公钥:
dig 20120113._domainkey.google.com TXT
这导致:
20120113._domainkey.google.com. 86400 IN TXT "k=rsa\; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp5kQ31/aZDreQqR9/ikNe00ywRvZBFHod6dja+Xdui4C1y8SVrkUMQQLOO49UA+ROm4evxAru5nGPbSl7WJzyGLl0z8Lt+qjGSa3+qxf4ZhDQ2chLS+2g0Nnzi6coUpF8r" "juvuWHWXnzpvLxE5TQdfgp8yziNWUqCXG/LBbgeGqCIpaQjlaA6GtPbJbh0jl1NcQLqrOmc2Kj2urNJAW+UPehVGzHal3bCtnNz55sajugRps1rO8lYdPamQjLEJhwaEg6/E50m58BVVdK3KHvQzrQBwfvm99mHLALJqkFHnhyKARLQf8tQMy8wVtIwY2vOUwwJxt3e0KcIX6NtnjSSwIDAQAB"
公钥是 p= 之后的所有内容。
但是...该选择器看起来像是基于日期的,这意味着 Google 可能会定期轮换它。你不能相信选择器总是有效的。
因此,如果您想可靠地验证收到的邮件,请省去编写自己的验证工具的麻烦并使用 OpenDKIM ( http://opendkim.org/ )。它不仅会验证收到的邮件,还会对您发出的邮件进行签名。