{"componentChunkName":"component---src-templates-post-template-jsx","path":"/works/posts/2020-11-26--001","result":{"data":{"site":{"siteMetadata":{"title":"Blog by Eunyoung","subtitle":"작업 기록 블로그","copyright":"© All rights reserved.","author":{"name":"EunYoung","twitter":"#"},"disqusShortname":"","url":"https://ssongey.github.io"}},"markdownRemark":{"id":"1b26d47c-34ce-555d-8df5-100c5dbd1764","html":"<h2>서명로직 코드</h2>\n<ul>\n<li>WCA ServerKey로 암호화 + base64 인코딩된 mo sub2 private key 복호화 후 서명</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">    <span class=\"token comment\">// private key 로 직접 서명</span>\n    <span class=\"token class-name\">String</span> base64EncodedMoSub2PrivKey <span class=\"token operator\">=</span> <span class=\"token string\">\"n2iWb4B7ES9Hc7HmAHvW5RMAAGUhwAJ3hOIUuqH9r9y5l4IGzg9nQfXxocKwJDIBSC/x67JcxNA6aALuz0gd+IQby7TTTfB74sxWSNjZUV67Xup0kPOx3wOWrxmO1R2/qGUkwflm3shSbz3YoWaavzipuYKen/6pBQ5kmKzONPFh+1Nprq34hY2lccf38QRp/aGXNbXvxRZcPsYGU5HIIw==\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">String</span> caServerKey <span class=\"token operator\">=</span> <span class=\"token string\">\"_u5PJineTniFyvQmHkWP6g\"</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">byte</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> moSub2PrivateKeyByte <span class=\"token operator\">=</span> <span class=\"token function\">aesDecode</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Base64</span><span class=\"token punctuation\">.</span><span class=\"token function\">decode</span><span class=\"token punctuation\">(</span>base64EncodedMoSub2PrivKey<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> caServerKey<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">PrivateKey</span> moSub2PrivateKey <span class=\"token operator\">=</span> <span class=\"token class-name\">PkiFactory</span><span class=\"token punctuation\">.</span><span class=\"token function\">privateKeyByteToClass</span><span class=\"token punctuation\">(</span>moSub2PrivateKeyByte<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token class-name\">SignatureType</span> signature <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SignatureType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    signature<span class=\"token punctuation\">.</span><span class=\"token function\">setSignedInfo</span><span class=\"token punctuation\">(</span>signedInfo<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">JAXBElement</span><span class=\"token generics\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">SignedInfoType</span><span class=\"token punctuation\">></span></span> signedInfoJAXB <span class=\"token operator\">=</span> <span class=\"token class-name\">ObjectFactory</span><span class=\"token punctuation\">.</span><span class=\"token function\">createSignedInfo</span><span class=\"token punctuation\">(</span>signedInfo<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token class-name\">SignatureValueType</span> signatureValue <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SignatureValueType</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\"><span class=\"token namespace\">java<span class=\"token punctuation\">.</span>security<span class=\"token punctuation\">.</span>interfaces<span class=\"token punctuation\">.</span></span>ECPrivateKey</span> ecPrivateKey <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\"><span class=\"token namespace\">java<span class=\"token punctuation\">.</span>security<span class=\"token punctuation\">.</span>interfaces<span class=\"token punctuation\">.</span></span>ECPrivateKey</span><span class=\"token punctuation\">)</span> moSub2PrivateKey<span class=\"token punctuation\">;</span>\n    signatureValue<span class=\"token punctuation\">.</span><span class=\"token function\">setValue</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">MsgFactory</span><span class=\"token punctuation\">.</span><span class=\"token function\">signSignedInfoElement</span><span class=\"token punctuation\">(</span>signedInfoJAXB<span class=\"token punctuation\">,</span> ecPrivateKey<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    signature<span class=\"token punctuation\">.</span><span class=\"token function\">setSignatureValue</span><span class=\"token punctuation\">(</span>signatureValue<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">byte</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> signatureXmlByte <span class=\"token operator\">=</span> <span class=\"token class-name\">MsgFactory</span><span class=\"token punctuation\">.</span><span class=\"token function\">marshalToByteArray</span><span class=\"token punctuation\">(</span>signature<span class=\"token punctuation\">,</span> <span class=\"token class-name\">SignatureType</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">class</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">String</span> signatureXmlStr <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">String</span><span class=\"token punctuation\">(</span>signatureXmlByte<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">  <span class=\"token keyword\">private</span> <span class=\"token keyword\">byte</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> <span class=\"token function\">aesDecode</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">byte</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> data<span class=\"token punctuation\">,</span> <span class=\"token class-name\">String</span> secretKey<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">final</span> <span class=\"token keyword\">byte</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> IV <span class=\"token operator\">=</span> <span class=\"token class-name\">Hex</span><span class=\"token punctuation\">.</span><span class=\"token function\">decode</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"62EC67F9C3A4A407FCB2A8C49031A8B3\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// TODO 16byte 넘어가는경우 자르지 말고, 16byte 길이를 유지할수 있는방법을 찾아봐야함.</span>\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token class-name\">String</span> password <span class=\"token operator\">=</span> secretKey<span class=\"token punctuation\">.</span><span class=\"token function\">length</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">&lt;</span> <span class=\"token number\">16</span> <span class=\"token operator\">?</span> <span class=\"token class-name\">StringUtils</span><span class=\"token punctuation\">.</span><span class=\"token function\">leftPad</span><span class=\"token punctuation\">(</span>secretKey<span class=\"token punctuation\">,</span> <span class=\"token number\">16</span><span class=\"token punctuation\">)</span>\n        <span class=\"token operator\">:</span> <span class=\"token class-name\">StringUtils</span><span class=\"token punctuation\">.</span><span class=\"token function\">substring</span><span class=\"token punctuation\">(</span>secretKey<span class=\"token punctuation\">,</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span> <span class=\"token number\">16</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token class-name\">Key</span> key <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">SecretKeySpec</span><span class=\"token punctuation\">(</span>password<span class=\"token punctuation\">.</span><span class=\"token function\">getBytes</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"AES\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token class-name\">Cipher</span> c <span class=\"token operator\">=</span> <span class=\"token class-name\">Cipher</span><span class=\"token punctuation\">.</span><span class=\"token function\">getInstance</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"AES/CBC/PKCS7Padding\"</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">BouncyCastleProvider</span><span class=\"token punctuation\">.</span>PROVIDER_NAME<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      c<span class=\"token punctuation\">.</span><span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token class-name\">Cipher</span><span class=\"token punctuation\">.</span>DECRYPT_MODE<span class=\"token punctuation\">,</span> key<span class=\"token punctuation\">,</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">IvParameterSpec</span><span class=\"token punctuation\">(</span>IV<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span> c<span class=\"token punctuation\">.</span><span class=\"token function\">doFinal</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span> <span class=\"token punctuation\">(</span><span class=\"token class-name\">Exception</span> e<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">throw</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">RuntimeException</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"java\"><pre class=\"language-java\"><code class=\"language-java\">  <span class=\"token keyword\">public</span> <span class=\"token keyword\">static</span> <span class=\"token class-name\">PrivateKey</span> <span class=\"token function\">privateKeyByteToClass</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">byte</span><span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span> privKey<span class=\"token punctuation\">)</span> <span class=\"token keyword\">throws</span> <span class=\"token class-name\">NoSuchProviderException</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">NoSuchAlgorithmException</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">InvalidKeySpecException</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token class-name\">KeyFactory</span> kf <span class=\"token operator\">=</span> <span class=\"token class-name\">KeyFactory</span><span class=\"token punctuation\">.</span><span class=\"token function\">getInstance</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"EC\"</span><span class=\"token punctuation\">,</span> <span class=\"token class-name\">BouncyCastleProvider</span><span class=\"token punctuation\">.</span>PROVIDER_NAME<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token class-name\">PrivateKey</span> privateKey <span class=\"token operator\">=</span> kf<span class=\"token punctuation\">.</span><span class=\"token function\">generatePrivate</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">PKCS8EncodedKeySpec</span><span class=\"token punctuation\">(</span>privKey<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> privateKey<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span></code></pre></div>","fields":{"tagSlugs":["/tags/pki/","/tags/sign/"],"slug":"/works/posts/2020-11-26--001"},"frontmatter":{"title":"[PKI] issuer private key로 서명","tags":["pki","sign"],"date":"2020-11-26","description":""}}},"pageContext":{"slug":"/works/posts/2020-11-26--001"}},"staticQueryHashes":[]}