Bài đăng nổi bật

Lập trình Java Spring Boot (20 buổi)

JAVA FULLSTACK VIỆT NAM: Website:  javafullstackvietnam.com Fan page:  https://www.facebook.com/JavaFullstackVietNam Group:  https://www.fac...

Thứ Năm, 31 tháng 12, 2015

Làm việc với object openxml4j trong apache poi (poi-ooxml)

Chào mừng năm mới 2016, đánh dấu sẽ viết bài sử dụng apache poi (poi-ooxml) để làm việc với Microsoft offices (2003/2007/20010...)

hehee. quên mất bài này :D

Phần này có mấy lưu ý nhỏ thôi

- Phần get private key và certificate vẫn dùng như cũ (dùng tocken, file pem, HSM...)

- Phần thiết lập chữ ký số trong offices:
           //Khai báo đối tượng OPC
           OPCPackage pkg = OPCPackage.open(FILE_INPUT_PATH, PackageAccess.READ_WRITE);

            SignatureConfig signatureConfig = new SignatureConfig();
            signatureConfig.setKey(this.get_PrivateKey());
            signatureConfig.setSigningCertificateChain(Collections.singletonList((X509Certificate) this.get_Cert()));

            signatureConfig.setOpcPackage(pkg);

            // adding the signature document to the package
            SignatureInfo si = new SignatureInfo();
            si.setSignatureConfig(signatureConfig);
            si.confirmSignature();
            // optionally verify the generated signature
            boolean b = si.verifySignature();
            assert (b);
            // write the changes back to disc
            pkg.close();

- Thư viện cần:
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.poifs.crypt.dsig.SignatureConfig;
import org.apache.poi.poifs.crypt.dsig.SignatureInfo;

Đơn giản vậy thôi :D

--Done--

Author: HVA

Thứ Ba, 29 tháng 12, 2015

C#: Sử dụng RSACryptoServiceProvider tương tác với HSM ncipher để ký và xác thực dữ liệu

- Bài này hướng dẫn cách kết nối HSM từ C#, sử dụng provider RSACryptoServiceProvider.
- Khuyến nghị Protect mode key hsm: module
- Tất cả câu lệnh config chạy trên thư mục gốc cài hsm (c:\Program Files (x86)\nCipher\nfast\bin)

Các bước chi tiết:

A. Cấu hình CSP và HSM

1. Tạo Key trên HSM (làm theo tài liệu administrator HSM)

2. Tạo Container để RSACryptoServiceProvider gọi tới
- Câu lệnh tạo container
# Keytst -c test_container

3. Import key từ key HSM vào Container vừa tạo
# Cspimport --import --key [KEY OF HSM WANT TO IMPORT TO CONTANER] --appname pkcs11 [ID OF CONTAINER] exchange
Trong đó:
[KEY OF HSM WANT TO IMPORT TO CONTANER]: ID của key trong HSM đã tạo
[ID OF CONTAINER]: id của Container

B. Code C# sử dụng RSACryptoServiceProvider

Sử dụng các thư viện trong c#:

using System.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Pkcs;


1. Khai báo tham số CspParameters:
CspParameters cp = new CspParameters(1, "nCipher Enhanced Cryptographic Provider");
cp.KeyContainerName = "test_container";

cp.Flags = CspProviderFlags.UseMachineKeyStore;

2. Khai báo RSACryptoServiceProvider và ký dữ liệu
RSACryptoServiceProvider RsaCSP=new RSACryptoServiceProvider(2048, cp);

Lúc này bạn có thể sử dụng RsaCSP để ký dữ liệu.
byte [] signature = RsaCSP.SignData("Hello HVA",  new SHA1CryptoServiceProvider());

3. Xác thực dữ liệu
bool isValid = RsaCSP.VerifyData("Hello HVA", new SHA1CryptoServiceProvider(), signature);

Như vậy là các bạn có thể tạo kết nối HSM nCipher sử dụng RSACryptoServiceProvider của microsoft C# để ký và xác thực dữ liệu. Tương tự các bạn có thể sử dụng để làm các việc khác như: mã hóa, giải mã...

Author: HVA

Cách sử dụng obfuscated-proguard (đóng gói thư viện java + netbeans8)


1. Tải plugins tại ứng dụng Netbeans8.
Trong menu Tools->plugins (search proguard) --> cài đặt

2. Cấu hình trong file build.xml của project

Copy thẻ xml dưới đây đặt trong thẻ <project> của file build.xml (Chú ý các chú thích màu đỏ)

<target name="-post-jar">
        <!--  cấu hình đường dẫn thư viện proguard  -->
<property name="proguard.jar.path" value="C:\Projects\MyOwn\Common_Lib\proguard\proguard4.10.jar" />
<!--  cấu hình đường dẫn java home  -->
        <property name="java.home.path" value="E:\DEV_Tools\JDK_1.7U60" />        
        <taskdef resource="proguard/ant/task.properties"
                 classpath="${proguard.jar.path}" />        
        <echo message="Obfuscating ${dist.jar}..."/>
        <mkdir dir="${build.dir}/obfuscated"/>
        <proguard printmapping="${build.dir}/obfuscated/${application.title}.map"
                  renamesourcefileattribute="SourceFile" ignorewarnings="true">            
            <!-- Specify the input jars, output jars, and library jars. -->
            <injar  file="${dist.jar}" />
<!--  cấu hình đường dẫn + tên file jar của thư viện -->
            <outjar file="${build.dir}/obfuscated/HVA.TESTConnector.jar" />            
            <libraryjar path="${javac.classpath}" />            
            <libraryjar file="${java.home.path}/jre/lib/rt.jar" />            
            <!-- Keep some useful attributes. -->
            <keepattribute name="InnerClasses" />
            <keepattribute name="SourceFile" />
            <keepattribute name="LineNumberTable" />
            <keepattribute name="Deprecated" />
            <keepattribute name="*Annotation*" />
            <keepattribute name="Signature" />            
            <!-- Preserve all public classes, and their public and protected fields and methods. -->
            <keep access="public">
                <field  access="public protected" />
                <method access="public protected" />
            </keep>                        
            <!-- Preserve all .class method names. -->
            <keepclassmembernames access="public">
                <method type      ="java.lang.Class"
                        name      ="class$"
                        parameters="java.lang.String" />
                <method type      ="java.lang.Class"
                        name      ="class$"
                        parameters="java.lang.String,boolean" />
            </keepclassmembernames>            
            <!-- Preserve all native method names and the names of their classes. -->
            <keepclasseswithmembernames>
                <method access="native" />
            </keepclasseswithmembernames>            
            <!-- Preserve the methods that are required in all enumeration classes. -->
            <keepclassmembers extends="java.lang.Enum">
                <method access="public static"
                        type="**[]"
                        name="values"
                        parameters="" />
                <method access="public static"
                        type="**"
                        name="valueOf"
                        parameters="java.lang.String" />
            </keepclassmembers>            
            <!-- Explicitly preserve all serialization members. The Serializable
                 interface is only a marker interface, so it wouldn't save them.
                 You can comment this out if your library doesn't use serialization.
                 With this code serializable classes will be backward compatible -->
            <keepnames implements="java.io.Serializable"/>
            <keepclassmembers implements="java.io.Serializable">
                <field  access    ="final"
                        type      ="long"
                        name      ="serialVersionUID" />
                <field  access    ="!static !transient"
                        name      ="**"/>
                <field  access    ="!private"
                        name      ="**"/>
                <method access    ="!private"
                        name      ="**"/>
                <method access    ="private"
                        type      ="void"
                        name      ="writeObject"
                        parameters="java.io.ObjectOutputStream" />
                <method access    ="private"
                        type      ="void"
                        name      ="readObject"
                        parameters="java.io.ObjectOutputStream" />
                <method type      ="java.lang.Object"
                        name      ="writeReplace"
                        parameters="" />
                <method type      ="java.lang.Object"
                        name      ="readResolve"
                        parameters="" />
            </keepclassmembers>            
            <!-- Your application may contain more items that need to be preserved;
                 typically classes that are dynamically created using Class.forName -->
        </proguard>

    </target>

3. Build lại Project
sau khi copy xong build lại project là bạn đã có một thư viện jar được đóng gói khá an toàn.

Author: HVA

Bài đăng phổ biến