성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>SignedXml을 이용한 ds:Signature만드는 방법</h1> <p> 다음과 같은 질문이 있군요.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > SignedXml을 이용한 ds:Signature만드는 방법좀 알려주세요. ; <a target='tab' href='https://social.msdn.microsoft.com/Forums/ko-KR/50c767ec-4e34-4289-a393-6b4aafe137f4/signedxml-dssignature-?forum=dotnetko&prof=required'>https://social.msdn.microsoft.com/Forums/ko-KR/50c767ec-4e34-4289-a393-6b4aafe137f4/signedxml-dssignature-?forum=dotnetko&prof=required</a> </pre> <br /> MSDN에서 SignedXml 클래스를 보면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > SignedXml Class ; <a target='tab' href='https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.xml.signedxml'>https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.xml.signedxml</a> </pre> <br /> 친절하게 예제 코드도 실어두고 있습니다. 그 예제를 실행해 보면 서명된 Xml 데이터를 포함하는 경우 다음과 같은 식의 XML 파일이 생성됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <MyElement xmlns="samples">Example text to be signed. <span style='color: blue; font-weight: bold'><Signature xmlns="http://www.w3.org/2000/09/xmldsig#"></span> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> <Reference URI=""> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> </Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>zSI5ZAMmQ+8u7R2rP7aAPT6nNQw=</DigestValue> </Reference> </SignedInfo> <SignatureValue>fDm0x8LvDpGWntkek6Q...[생략]...JwOyVJkxzcs=</SignatureValue> <span style='color: blue; font-weight: bold'></Signature></span> </MyElement> </pre> <br /> 질문자는, <Signature /> 노드가 <ds:Signature xmlns:ds="<a target='tab' href='http://www.w3.org/2000/09/xmldsig#'>http://www.w3.org/2000/09/xmldsig#</a>" />와 같이 나오길 바라는 것입니다. 그런데, 웹 상의 답변들은 어쨌든 나온 결과물에서 텍스트만 그렇게 수정하면 된다는 식이고.<br /> <br /> 하지만, 질문자는 그에 대해 이렇게 알고 있습니다.<br /> <br /> <div style='BACKGROUND-COLOR: #ccffcc; padding: 10px 10px 5px 10px; MARGIN: 0px 10px 10px 10px; FONT-FAMILY: Malgun Gothic, Consolas, Verdana; COLOR: #005555'> 구글링 및 여러 자료를 찾아봐도 전부다 서명계산 후에 Prefix하는 방법만 알려주는군요. 서명계산 후에 하면 Hash Value가 달라지므로<br /> <br /> 그렇게 하면 안되거든요...<br /> </div><br /> <br /> 생각해 보니, 저렇게 오해할 수도 있겠구나... 싶습니다. 사실 서명 작업은 대상 데이터를 입력으로 삼는 것이지, 대상 데이터를 서명한 것을 포함한 그걸 또 서명하는 것은 아닙니다. 따라서, XML 데이터를 서명하는 경우 대상 XML 데이터를 정규화(Canonicalization)한 후 그것을 서명해서 덧붙이는 것입니다. 그런 연유로, 대상 XML 데이터만 바꾸지 않는다면 서명으로 포함되는 정보, 즉 <Signature />는 적법한 XML이기만 하면 됩니다.<br /> <br /> 실제로 <a target='tab' href='https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.xml.signedxml'>SignedXm Class</a> 문서에 포함된 예제에서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > SignXmlFile("Example.xml", "signedExample.xml", Key); Console.WriteLine("XML file signed."); <span style='color: blue; font-weight: bold'>Console.ReadLine();</span> // Verify the signature of the signed XML. Console.WriteLine("Verifying signature..."); bool result = VerifyXmlFile("SignedExample.xml", Key); </pre> <br /> 위와 같이 서명과 검증 사이에 Console.ReadLine을 추가해 멈춰놓고 signedExample.xml파일의 내용을<Signature />에 <ds:Signature />로 처리해서 진행해도 정상적으로 검증 작업을 통과합니다.<br /> <br /> 이렇게 텍스트만 바꾸는 식의 후처리를 해도 되는데, 더 쉬운 방법은 SignedXml.GetXml로 반환받은 XmlElement의 Prefix를 지정해서 처리하는 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > XmlElement xmlDigitalSignature = signedXml.GetXml(); xmlDigitalSignature.Prefix = "ds"; </pre> <br /> 그럼, XML 파일이 다음과 같이 바뀝니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > <MyElement xmlns="samples">Example text to be signed. <span style='color: blue; font-weight: bold'><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"></span> <span style='color: blue; font-weight: bold'><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"></span> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> <Reference URI=""> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> </Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>zSI5ZAMmQ+8u7R2rP7aAPT6nNQw=</DigestValue> </Reference> </SignedInfo> <span style='color: blue; font-weight: bold'><SignatureValue xmlns="http://www.w3.org/2000/09/xmldsig#"></span>fDm0x8LvDpGWntkek6Q...[생략]...JwOyVJkxzcs=</SignatureValue> <span style='color: blue; font-weight: bold'></ds:Signature></span> </MyElement> </pre> <br /> 첨부한 파일은 위의 처리를 추가한 <a target='tab' href='https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.xml.signedxml'>SignedXm Class</a> 문서의 변형 코드를 담고 있습니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1200
(왼쪽의 숫자를 입력해야 합니다.)