Hash Filter の開発

Prev Next

Classic/VPC環境で利用できます。

Hash Filter REST APIを使用して Hash Filterコードを作成する方法を説明します。

参考

Hash Filter開発の先に、File Saferご利用の申し込み、API Gatewayご利用の申し込みと API Keyを作成する必要があります。詳細は、File Safer を開始するをご参照ください。

Hash Filter実現のシナリオ

ユーザーがアップロード/ダウンロードするファイルに対する Hash Filter適用シナリオは、次の通りです。

filesafer-programming-hash_scenario_ko

1.マルウェアが疑われるファイルを区分
2.区分されたファイルから Hash値を抽出
3.認証値作成
4.リクエストパラメータ追加
5.APIリクエスト
6.レスポンス値確認とブロック有無を判断

Hash Filterコード作成

Hash Filter の実装シナリオに従ってコードを作成します。

1.マルウェアが疑われるファイルを区分

アップロード/ダウンロードされるファイルの中から、マルウェアスキャンが必要なファイルを区分します。

2.区分されたファイルから Hash値を抽出

ファイルから Hash値を抽出します。以下は、Hash値を抽出する JAVAのサンプルコードです。

参考

Hashタイプ別の Hash値の表記フォームは、次の通りです。

  • SHA-1: 16進数40byte文字列で表記
    例) 3ec625cb2277d7334406ab712b69c4ceaf38bd82
  • MD5: 16進数32byte文字列で表記
    例) 8072fd6da170738c905cf362f787442b
public static String getHash(String filename, String algorithm) throws Exception
{
	MessageDigest md = MessageDigest.getInstance(algorithm);

	// file hashing with DigestInputStream
	DigestInputStream dis = new DigestInputStream(new FileInputStream(new File(filename)), md);

	// empty loop to clear the data
	while(dis.read() != -1);
	dis.close();

	// Get the hash's bytes
	byte[] hashBytes = md.digest();

	// bytes to hex
	StringBuffer sb = new StringBuffer();
	for(byte h : hashBytes) {
		sb.append(String.format("%02x", h));
	}

	return sb.toString();
}

public static void main(String[] args)
{
    try {
        // Get hash value of a file with SHA-1 Algorithm
        String sha1 = getHash("./test.exe", "sha-1");
        // Get hash value of a file MD5 Algorithm
        String md5 = getHash("./test.exe", "md5");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

3.認証値作成

NAVERクラウドプラットフォーム API使用認証に必要な IAM認証値を作成します。認証に必要なヘッダは次の通りです。

  • x-ncp-iam-access-key: コンソールの My Account > アカウントとセキュリティ管理 > セキュリティ管理 > アクセス管理メニューから Access Keyを発行
  • x-ncp-apigw-signature-v2: Access Keyとマッピングされる Secret Keyを HmacSHA256暗号化し、signature値を作成(改行文字は \nを使用)
  • x-ncp-apigw-api-key: API Gatewayで API Keyを発行
  • x-ncp-apigw-timestamp: 認証値ではないがリクエストヘッダに含まれる。API明細を参照
参考

signature値を作成する方法とサンプルコードは、NAVERクラウドプラットフォーム APIガイド > API の概要 > 基本 API > Ncloud API > 2.ヘッダ作成をご参照ください。

4.リクエストパラメータ追加

Hash Filter APIリクエストパラメータ値を追加します。リクエストパラメータは次の通りです。

  • hashCode: Hash値を文字列に追加
  • hashType: Hash値のアルゴリズムを表記(MD5または SHA-1)

以下は、作成されたパラメータの例です。

hashCode=00010efc49b7174d18400710eed1642a7d4b12db&hashType=sha1
参考

Hash Filter REST APIの明細は、checkHash(Hash Filter)をご参照ください。

5.APIリクエスト

上記の3番と4番の手続きで作成したヘッダとパラメータを使用し、 Hash Filter URIにリクエストします。以下は、Hash Filter APIリクエストのサンプルコードです。

public static void main(String[] args) throws Exception
{
	String accessKey = "ACCESS_KEY"; // access key (from portal or sub account)
    String apikey = API_GATEWAY_KEY;
	String apiDomain = "https://filesafer.apigw.ntruss.com";
	String method = "GET";
	long timestamp = System.currentTimeMillis();   
 
	// step 2, 3: Extract hash vlaue of a identified file then add parameter value including hash value and hash type
	String param = "hashCode=" + getHash("./test.exe") + "&hashType=sha1";
	// The apiURL is the value obtained by appending parameter to the end of URI string provided by Hash Filter.
	String apiURL = "/hashfilter/v1/checkHash?" + param;

	// step 4: Create authentication value
	String signature = makeSignature(method, apiURL, timestamp);

	// step 5: Request API
	URL url = new URL(apiDomain + apiURL);
	HttpURLConnection con = (HttpURLConnection)url.openConnection();
	con.setRequestMethod(method);
	con.setRequestProperty("x-ncp-apigw-timestamp", Long.toString(timestamp));
	con.setRequestProperty("x-ncp-iam-access-key", accessKey);
	con.setRequestProperty("x-ncp-apigw-signature-v2", signature);
    con.setRequestProperty("x-ncp-apigw-api-key", apikey);
	con.setRequestProperty("accept", "application/json");

	// step 6: Check the response value and determine whether to block
	int httpResponseCode = con.getResponseCode();
	BufferedReader br = null;
	if (httpResponseCode == 200) {
		br = new BufferedReader(new InputStreamReader(con.getInputStream()));

		String readLine;
		StringBuffer httpResponse = new StringBuffer();

		while((readLine = br.readLine())! = null) {
			httpResponse.append(readLine);
		}

		// Do next step (ex, determine whether to block)
		...

		br.close();
	}
}
参考

jdk20以上の使用時、URLメソッドの代わりに URIメソッドを使用できます。

6.レスポンス値確認とブロック有無を判断

API呼び出しレスポンス値のhashCheckResultListobject値を確認し、マルウェアの有無を判断してファイルを処理します。
hashCheckResultListobjectがある場合はマルウェアが検知されたことを意味し、そうでない場合はマルウェアがないことを意味します。