iText 및 블록체인

iText 및 블록체인을 활용해 블록체인 기술을 iText에 통합할 수 있으며, PDF 문서 대신 블록체인에 디지털 서명을 저장할 수 있습니다.

기능 및 이점

화살표를 클릭해 기능과 이점을 확장하십시오.

iText 및 블록체인 튜토리얼 비디오

핵심 기능

블록체인의 데이터

  • 확인된 PKI 인프라를 사용해 서명할 수 있습니다.
  • 자동으로 유효성이 검사되고 타임 스탬프가 적용됩니다.
  • 모든 사람이 볼 수 있습니다.
  • 참조하는 실물(실제) 데이터에서 별도로 존재할 수 있습니다.

PDF와의 관계:

  • Pdf 문서는 디지털 서명이 가능합니다.
    • 인증 기관(중앙 집중식)이 필요합니다.
    • 타임 서버(중앙 집중식)가 필요합니다.
    • 동시에 서명할 수 없습니다.
    • 서명은 문서에 있습니다.
  • 인터넷에서의 신뢰
  • 무결성: "문서에 이 정확한 컨텐츠가 있습니다."
  • 인증: "제가 문서를 생성했습니다. 그리고 이를 증명할 수 있습니다."
  • 부인 방지: "그는 문서를 생성했습니다. 그리고 이를 증명할 수 있습니다."
  • 타임스탬프

pdfChain

iText 및 블록체인을 사용해야 하는 이유

블록체인에 데이터가 있습니다. '블록'이라는 단위로 이 데이터를 수집합니다. 조작되지 않은 블록을 증명하기 위한 메커니즘이 있습니다. 그리고 시간이 흐르면서 블록들이 서로 연결됩니다. 이러한 연결이 유기적으로 일종의 '기록'을 가능하게 합니다.

블록체인 기술

블록체인은 인증 및 부인 방지를 처리하는 기존 기술을 대체합니다. 우선, 문서에 디지털 서명을 할 수 있는 여러 방법이 있습니다. 일반적으로 "서명을 한다는 것"은 문서의 해시를 생성하고, 개인 키로 해시에서 서명을 생성하고 보관한다는 의미입니다. 여기에는 두 가지 효과가 있습니다.

  1. 서명을 통해 누가 문서에 서명했는지 확인합니다.
  2. 암호화할 경우, 서명은 계산된 파일을 식별합니다.

    그러한 서명이 블록체인에 저장되면 변경 또는 삭제할 수 없습니다. 이를 통해 추가 이점을 얻게 됩니다.

  3. 서명이 블록체인에 있다는 사실은 운영 완료 시점을 알려줍니다.

이후에 다음과 같이 얘기할 수 있습니다. "전 2016년 10월 10일에 이 해시를 만들었습니다. 해시가 있는 블록체인에 해당 거래가 있습니다. 전 이 파일의 공식에 따라 이를 생성했습니다. " 이제 모든 사람이 파일을 보고 해시를 다시 계산하여 블록체인에 보관된 사항과 일치하는지 확인할 수 있습니다. 이 모든 것이 가능한 이유는 다음과 같습니다.

  1. 파일에서 해시를 연산하기는 매우 쉽지만, 정확하게 동일한 해시를 생산하는 유사 파일을 만들기란 매우 어렵습니다.
  2. 블록체인 내 보관된 데이터를 변경하는 것은 사실상 불가능합니다.
  3. 블록체인 내 모든 거래에는 타임스탬프가 있으므로 거래의 정확한 완료 시점을 알 수 있습니다.

이론적 사용 사례 - 고급

고급 수준에서는 서명 및 통합 기능을 PDF에서 분리하고, 블록체인으로 가져옵니다. 예시 사용 사례를 생각해 보십시오.

  1. 문서가 생성되었고 문서 ID(해시, 해싱 알고리즘 이름 포함)가 공용 블록체인에 저장됩니다. 해시가 일반적으로 전체 문서 재구성을 허용하지 않기 때문에 문제가 발생하지 않습니다. 장기 검증을 위해 해싱 알고리즘을 체인에 적용했습니다.
  2. 이제 이 문서가 인보이스라고 생각해 보십시오. Bob은 집에서 일을 마무리했고, 수리 회사는 그에게 인보이스를 보냈습니다.
  3. Bob은 가격에 동의하고 지불할 것임을 나타내는 인보이스에 서명하려 합니다. Bob의 개인 키를 사용해 문서의 해시값을 암호화했습니다. 이 서명(ID는 문서, 원본 해시값, 서명 해시값은 물론 해싱 알고리즘과 서명 알고리즘 이름으로 구성)은 블록체인에 보관됩니다.
  4. 수리 회사에서 근무하는 Alice는 Bob이 이미 서명했는지 확인하고 싶어 합니다. 제공된 ID(문서 ID)에 대한 블록체인에서 모든 기록을 쉽게 조회할 수 있습니다. 이러한 기록 중 하나는 Bob이 초반에 생성한 기록이어야 합니다. 기록에는 원본 해시 그리고 모든 관련 알고리즘의 이름이 있으므로, Alice는 2가지를 확인할 수 있습니다.
    • 해시, 서명된 해시, 공용 키를 사용하여 서명한 것은 Bob이었습니다.
    • Bob은 문서 ID 및 해시를 사용해 정확한 문서에 서명했습니다.

블록체인 - 고급 아이디어

이론적 사용 사례 - 하위 수준

구현

블록체인 구현 시 부가되는 인터페이스는 소수이지만, 무엇보다 복잡한 애플리케이션 및 워크플로우 구성에 필요한 추출을 제공합니다. 멀티맵으로 블록체인을 추출하고, 최종 사용자가 Record(HashMap<string, object> )로 표시된 객체를 저장하고 키(스트링)에 연결할 수 있게 합니다.

public interface IBlockChain {
 
    /**
     * 데이터를 블록체인에 입력
     *
     * @param 키 블록체인에 데이터를 저장하는 데 사용되는 키
     * @param 데이터 블록체인에 저장된 데이터
     */
    public boolean put(String key, Record data);
 
    /**
     * 블록체인에서 데이터 가져오기
     *
     * @param 키 쿼리된 키
     * @return
     */
    public List<Record> get(String key);
 
    /**
     * 블록체인에서 모든 데이터 가져오기
     * @return
     */
    public List<Record> all();
}


JSON-RPC 및 멀티체인을 사용한 구체적인 구현

개념 증명으로 JSON-RPC(원격 절차 호출) 및 멀티체인을 사용해 인터페이스 IBlockchain을 구현하였습니다.

멀티체인을 활용한 블록체인 설정에 대해 자세히 알고 싶다면, 웹 사이트에서 더 많은 리소스, 특히 여기에 있는 시작하기 가이드를 참조하십시오.


iText 및 블록체인 예시

이 예시에서는 서명과 함께 블록체인에 문서를 배치하는 방법을 보여줍니다.

       IBlockChain mc = new MultiChain(
                "http://127.0.0.1",
                4352,
                "chain1",
                "stream1",
                "multichainrpc",
                "BHcXLKwR218R883P6pjiWdBffdMx398im4R8BEwfAxMm");
 
        InputStream keystoreInputStream = BasicFunctionalityTest.class.getClassLoader().getResourceAsStream("ks");
        InputStream inputFileStream = BasicFunctionalityTest.class.getClassLoader().getResourceAsStream("input.pdf");
 
        AbstractExternalSignature sgn = new DefaultExternalSignature(keystoreInputStream, "demo", "password");
 
        PdfChain chain = new PdfChain(mc, sgn);
 
        // put a document on the chain
        boolean wasAdded = chain.put(inputFileStream);
        Assert.assertTrue(wasAdded);
 
        // check whether the chain now contains this value
        boolean isEmpty = chain.get("z�L{�Wd=��\u007F\u0010��G�").isEmpty();


다음과 같이 블록체인에서 문서 정보를 조회할 수 있습니다.

  IBlockChain mc = new MultiChain(
                "http://127.0.0.1",
                4352,
                "chain1",
                "stream1",
                "multichainrpc",
                "BHcXLKwR218R883P6pjiWdBffdMx398im4R8BEwfAxMm");
 
        PdfChain chain = new PdfChain(mc);
 
        for(Record record : chain.get(new File("example_file.pdf")))
        {
            for(Map.Entry<String,Object> en : record.entrySet())
            {
                System.out.println(en.getKey() + "\t" + en.getValue().toString());
            }
            System.out.println("");
        }