<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PHP on Allens' Blog</title><link>https://allens.tech/categories/php/</link><description>Recent content from Allens' Blog</description><generator>Hugo</generator><language>en-us</language><managingEditor>allens.leng@gmail.com (Allens)</managingEditor><webMaster>allens.leng@gmail.com (Allens)</webMaster><copyright>All articles on this blog are licensed under the BY-NC-SA license agreement unless otherwise stated. Please indicate the source when reprinting!</copyright><lastBuildDate>Thu, 24 Sep 2020 21:00:00 +0800</lastBuildDate><atom:link href="https://allens.tech/categories/php/index.xml" rel="self" type="application/rss+xml"/><item><title>解决 PHP &amp; JAVA 使用 SHA512 配合 Base64 签名不一致的问题</title><link>https://allens.tech/post/202009242100/</link><pubDate>Thu, 24 Sep 2020 21:00:00 +0800</pubDate><author>allens.leng@gmail.com (Allens)</author><guid>https://allens.tech/post/202009242100/</guid><description>
<![CDATA[<h1>解决 PHP & JAVA 使用 SHA512 配合 Base64 签名不一致的问题</h1><p>Author: Allens(allens.leng@gmail.com)</p>
        
          <h2 id="描述">
<a class="header-anchor" href="#%e6%8f%8f%e8%bf%b0"></a>
描述
</h2><p>最近女朋友对接的 OpenAPI 是使用 SHA512 加密 + Base64 编码的签名进行鉴权，Demo 是用 JAVA 写的，PHP 得到的签名总是和 JAVA Demo 得到的不一致</p>
<h2 id="问题分析">
<a class="header-anchor" href="#%e9%97%ae%e9%a2%98%e5%88%86%e6%9e%90"></a>
问题分析
</h2><ul>
<li>首先，字符串是固定顺序拼接的，所以不存在排序问题。</li>
<li>个人用 Go 语言实现了一下，结果与 JAVA 一致</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-Go" data-lang="Go"><span style="display:flex;"><span><span style="color:#f92672">package</span> <span style="color:#a6e22e">main</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> (
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;crypto/sha512&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;encoding/base64&#34;</span>
</span></span><span style="display:flex;"><span>	<span style="color:#e6db74">&#34;fmt&#34;</span>
</span></span><span style="display:flex;"><span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">func</span> <span style="color:#a6e22e">main</span>() {
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">s</span> <span style="color:#f92672">:=</span> <span style="color:#e6db74">`example str`</span>
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">h</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">sha512</span>.<span style="color:#a6e22e">New</span>()
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">h</span>.<span style="color:#a6e22e">Write</span>([]byte(<span style="color:#a6e22e">s</span>))
</span></span><span style="display:flex;"><span>	<span style="color:#a6e22e">fmt</span>.<span style="color:#a6e22e">Printf</span>(<span style="color:#e6db74">&#34;%s\n&#34;</span>, <span style="color:#a6e22e">base64</span>.<span style="color:#a6e22e">StdEncoding</span>.<span style="color:#a6e22e">EncodeToString</span>(<span style="color:#a6e22e">h</span>.<span style="color:#a6e22e">Sum</span>(<span style="color:#66d9ef">nil</span>)))
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><ul>
<li>首先排查下是不是 PHP SHA512 的问题，先用 PHP 进行 SHA512 然后和 Go 进行 SHA512 得到的计算结果对比，结果一致</li>
</ul>
<blockquote>
<p>排除掉 sha512 加密方法本身的问题</p>
</blockquote>
<ul>
<li>使用 Go 直接进行 Base64 编码 SHA512 加密的字符串，发现结果和 PHP 一致</li>
</ul>
<blockquote>
<p>排除掉 Base64 编码方法本身的问题</p>
        
        <hr><p>Published on 2020-09-24 at <a href='https://allens.tech/'>Allens' Blog</a>, last modified on 2020-09-24</p>]]></description><category>PHP</category></item></channel></rss>