<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>SHB on Nullbyte blog</title><link>https://blog.nullbyte.eu/tags/shb/</link><description>Recent content in SHB on Nullbyte blog</description><generator>Hugo -- 0.166.0</generator><language>en-us</language><lastBuildDate>Sat, 25 Feb 2012 15:47:00 -0500</lastBuildDate><atom:link href="https://blog.nullbyte.eu/tags/shb/index.xml" rel="self" type="application/rss+xml"/><item><title>The new Handelsbanken API</title><link>https://blog.nullbyte.eu/the-new-handelsbanken-api/</link><pubDate>Sat, 25 Feb 2012 15:47:00 -0500</pubDate><guid>https://blog.nullbyte.eu/the-new-handelsbanken-api/</guid><description>How the new Handelsbanken login method works: the custom keyboard matrix is sent as an image, but that does not add real security.</description><content:encoded><![CDATA[<p><img src="squirrelandnuts.png" alt="" style="float:right; display:block; margin:0 0 0 1rem;">The updated Handelsbanken app for Android and iPhone uses a new API with a new login method. The login method attempts to increase security by obfuscating some of the data. The custom keyboard matrix for example is sent as an image instead of clear text. <br>
This might make things appear more secure to the end user but doesn&rsquo;t provide any significant technical security benefits. <br>
The following example will demonstrate how the new login method works.</p>
<h2 id="request-to-get-the-custom-keyboard">Request to get the custom keyboard</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="cl"><span class="nf">GET</span> <span class="nn">/app/init-matrix-xml?height=600&amp;width=628</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
</span></span><span class="line"><span class="cl"><span class="n">Cache-Control</span><span class="o">:</span> <span class="l">no-transform</span>
</span></span><span class="line"><span class="cl"><span class="n">X-SHB-DEVICE-CLASS</span><span class="o">:</span> <span class="l">app</span>
</span></span><span class="line"><span class="cl"><span class="n">User-Agent</span><span class="o">:</span> <span class="l">Mozilla/5.0 (Linux; U; Android 4.0.2; sv-; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30</span>
</span></span><span class="line"><span class="cl"><span class="n">X-SHB-DEVICE-MODEL</span><span class="o">:</span> <span class="l">AND-4.0.2, 2.0.2, Galaxy Nexus</span>
</span></span><span class="line"><span class="cl"><span class="n">X-SHB-MCC</span><span class="o">:</span> <span class="l">240</span>
</span></span><span class="line"><span class="cl"><span class="n">X-SHB-MNC</span><span class="o">:</span> <span class="l">02</span>
</span></span><span class="line"><span class="cl"><span class="err">X-SHB-LC:</span>
</span></span><span class="line"><span class="cl"><span class="g">X-SHB-APP-VERSION: 2.0
</span></span></span><span class="line"><span class="cl"><span class="g">X-SHB-DEVICE-ID: 123456789012345
</span></span></span><span class="line"><span class="cl"><span class="g">Host: m2.handelsbanken.se
</span></span></span><span class="line"><span class="cl"><span class="g">Connection: Keep-Alive
</span></span></span></code></pre></div><p>This is the first request that is sent to <abbr title="Svenska Handelsbanken AB">SHB</abbr> when a user attempts to login. The <code>height</code> and <code>width</code> parameters define the desired size of the keyboard image returned in the response.</p>
<p>All headers starting with <code>X-SHB</code> are sent with every request and mostly contain information about the device that performs the request.</p>
<h2 id="the-keyboard-matrix-response">The keyboard matrix response</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="cl"><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span>
</span></span><span class="line"><span class="cl"><span class="n">Date</span><span class="o">:</span> <span class="l">Sat, 25 Feb 2012 20:56:29 GMT</span>
</span></span><span class="line"><span class="cl"><span class="n">Server</span><span class="o">:</span> <span class="l">Apache</span>
</span></span><span class="line"><span class="cl"><span class="n">Cache-Control</span><span class="o">:</span> <span class="l">private, proxy-revalidate</span>
</span></span><span class="line"><span class="cl"><span class="n">Content-Language</span><span class="o">:</span> <span class="l">en-US</span>
</span></span><span class="line"><span class="cl"><span class="n">Connection</span><span class="o">:</span> <span class="l">close</span>
</span></span><span class="line"><span class="cl"><span class="n">Content-Type</span><span class="o">:</span> <span class="l">text/html;charset=UTF-8</span>
</span></span><span class="line"><span class="cl"><span class="n">Content-Length</span><span class="o">:</span> <span class="l">10517</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">&lt;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;</span><span class="nt">response</span> <span class="na">code</span><span class="o">=</span><span class="s">&#34;000&#34;</span> <span class="na">label</span><span class="o">=</span><span class="s">&#34;OK&#34;</span> <span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;</span><span class="nt">matrix</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">matrixId</span><span class="p">&gt;</span>009013526<span class="p">&lt;/</span><span class="nt">matrixId</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">matrixMetaData</span><span class="p">&gt;</span>0,5,7,11,13,14<span class="p">&lt;/</span><span class="nt">matrixMetaData</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;</span><span class="nt">image</span> <span class="na">type</span><span class="o">=</span><span class="s">&#34;png&#34;</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">                <span class="cp">&lt;![CDATA[ ... base64 encoded png data, example below ... ]]&gt;</span>
</span></span><span class="line"><span class="cl">            <span class="p">&lt;/</span><span class="nt">image</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">        <span class="p">&lt;/</span><span class="nt">matrix</span><span class="p">&gt;</span>
</span></span><span class="line"><span class="cl">    <span class="p">&lt;/</span><span class="nt">response</span><span class="p">&gt;</span>
</span></span></code></pre></div><p>What we&rsquo;re looking for in the response is the <code>matrixId</code> tag (we&rsquo;ll need to send it back to the api when we&rsquo;re logging in) and the <code>image</code> tag.</p>
<p><code>matrixMetaData</code> tells the Android/iPhone app which buttons on the custom keyboard to make clickable. Not very interesting to us so we&rsquo;ll disregard it.</p>
<h2 id="mapping-a-password-to-matrix-positions">Mapping a password to matrix positions</h2>
<p>The <code>image</code> tag contains a base64 encoded transparent png image and looks something like this:</p>
<p><img src="numpad.png" alt="SHB custom keyboard" class="keyboard_matrix"> <br>
The image represents a 4<em>4 matrix where the numbers 0 to 9 have been placed randomly, the remaining 6 positions are empty. <br>
When a user enters a password their real password isn&rsquo;t sent to the api, instead the indices of the selected numbers (in a transposed 4</em>4 matrix) are sent as a concatenated string. <br>
Let&rsquo;s say the users password is 1234 and we&rsquo;ve extracted the following matrix from the image:</p>
<div class="num-matrix"> <span> <span>9</span><span></span><span>6</span><span>8</span> </span> <span> <span class="sel">4</span><span>0</span><span></span><span></span> </span> <span> <span>7</span><span> </span><span>5</span><span class="sel">2</span> </span> <span> <span class="sel">3</span><span></span><span class="sel">1</span><span></span> </span> </div>
<p>Now the only thing that remains to do is to pick out the corresponding index for every number from the matrix below and send it to the api together with the username and matrixId.</p>
<div class="num-matrix"> <span> <span>0</span><span>4</span><span>8</span><span>12</span> </span> <span> <span class="sel">1</span><span>5</span><span>9</span><span>13</span> </span> <span> <span>2</span><span>6</span><span>10</span><span class="sel">14</span> </span> <span> <span class="sel">3</span><span>7</span><span class="sel">11</span><span>15</span> </span> </div>
<p>The user enters the password <code>1234</code> and we get the positions <code>11,14,3,1</code>.</p>
<h2 id="login-request">Login request</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="cl"><span class="nf">GET</span> <span class="nn">/bb/glss/servlet/ssco_auth4?deviceid=123456789012345&amp;username=8001010000&amp;matrixPos=11,14,3,1&amp;matrixId=009013526&amp;entryId=privpnrpinse&amp;appAction=doAuthentication&amp;JSP_PATH=ssse&amp;language=sv&amp;country=SE&amp;deviceClass=app</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
</span></span><span class="line"><span class="cl"><span class="n">Cache-Control</span><span class="o">:</span> <span class="l">no-transform</span>
</span></span><span class="line"><span class="cl"><span class="n">X-SHB-DEVICE-CLASS</span><span class="o">:</span> <span class="l">app</span>
</span></span><span class="line"><span class="cl"><span class="n">User-Agent</span><span class="o">:</span> <span class="l">Mozilla/5.0 (Linux; U; Android 4.0.2; sv-; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30</span>
</span></span><span class="line"><span class="cl"><span class="n">X-SHB-DEVICE-MODEL</span><span class="o">:</span> <span class="l">AND-4.0.2, 2.0.2, Galaxy Nexus</span>
</span></span><span class="line"><span class="cl"><span class="n">X-SHB-MCC</span><span class="o">:</span> <span class="l">240</span>
</span></span><span class="line"><span class="cl"><span class="n">X-SHB-MNC</span><span class="o">:</span> <span class="l">02</span>
</span></span><span class="line"><span class="cl"><span class="err">X-SHB-LC:</span>
</span></span><span class="line"><span class="cl"><span class="g">X-SHB-APP-VERSION: 2.0
</span></span></span><span class="line"><span class="cl"><span class="g">X-SHB-DEVICE-ID: 123456789012345
</span></span></span><span class="line"><span class="cl"><span class="g">Host: m2.handelsbanken.se
</span></span></span><span class="line"><span class="cl"><span class="g">Connection: Keep-Alive
</span></span></span></code></pre></div><p>We&rsquo;re almost there! But first a short description of some of the parameters: <br>
<code>deviceid</code> - the device id from your Android/iPhone. Should be the same as the one in the header. <br>
<code>username</code> - the users&rsquo; social security number in the format <code>YYMMDDXXXX</code>. <br>
<code>matrixPos</code> - the positions of the numbers we calculated earlier. <br>
<code>matrixId</code> - the same id that we got from our first request to the api.</p>
<h2 id="login-response">Login response</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-http" data-lang="http"><span class="line"><span class="cl"><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">Document follows</span>
</span></span><span class="line"><span class="cl"><span class="n">Date</span><span class="o">:</span> <span class="l">Sat, 25 Feb 2012 20:58:41 GMT</span>
</span></span><span class="line"><span class="cl"><span class="n">Server</span><span class="o">:</span> <span class="l">Apache</span>
</span></span><span class="line"><span class="cl"><span class="n">Cache-Control</span><span class="o">:</span> <span class="l">private, proxy-revalidate, no-cache=&#34;set-cookie, set-cookie2&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">Accept-Ranges</span><span class="o">:</span> <span class="l">bytes</span>
</span></span><span class="line"><span class="cl"><span class="n">Expires</span><span class="o">:</span> <span class="l">Thu, 01 Dec 1994 16:00:00 GMT</span>
</span></span><span class="line"><span class="cl"><span class="n">Content-Language</span><span class="o">:</span> <span class="l">en-US</span>
</span></span><span class="line"><span class="cl"><span class="n">Set-Cookie</span><span class="o">:</span> <span class="l">JSESSIONID=0000Y4saPX4Aq_tCypur61bkzki:C4F1745366942536000007A8000098D000000000; Path=/</span>
</span></span><span class="line"><span class="cl"><span class="n">Content-Length</span><span class="o">:</span> <span class="l">226</span>
</span></span><span class="line"><span class="cl"><span class="n">Last-Modified</span><span class="o">:</span> <span class="l">Sat, 25 Feb 2012 20:58:40 GMT</span>
</span></span><span class="line"><span class="cl"><span class="n">Connection</span><span class="o">:</span> <span class="l">close</span>
</span></span><span class="line"><span class="cl"><span class="n">Content-Type</span><span class="o">:</span> <span class="l">text/xml;charset=UTF-8</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nt">&lt;response</span> <span class="na">code=</span><span class="s">&#34;X8005&#34;</span> <span class="na">label=</span><span class="s">&#34;Kontrollera dina uppgifter. Efter tre felaktiga kodförsök spärras koden. I Internettjänsten kan du byta din kod om den har blivit spärrad. Alternativt kan du kontakta närmaste bankkontor.&#34;</span><span class="nt">/&gt;</span>
</span></span></code></pre></div><p>Yea&hellip; well I don&rsquo;t have a SHB account (yet) so I couldn&rsquo;t get any further than this. I&rsquo;ll update this post with more information about the API when I get my login credentials from SHB.</p>
]]></content:encoded></item></channel></rss>