文件安全信息云查服务V2
接口说明
通过PC文件md5或者md5+sha1值,查询PC文件安全等级、恶意木马名称、威胁类型、威胁描述、是否要求上传等信息。 响应报文level级别描述说明:10 纯白 白名单收集,20 白 回扫或者其他方式确认为白的,30 灰白 杀软扫描没报的,40 灰 未知,50 低疑似 误报率高的,60 高疑似 误报率低的,70 杀软确认报是病毒或木马黑。注意最高level等级就是70! 可以通过 exts 中增加 le 控制返回的 ext.type_desc 语言,value 值参考参数说明或示例中的注释。 一次最多查10个文件,超过部分无效,只查前10个。
请求报文格式示例:
{
"data": [
{
"md5": "694aac16cef20a4324947ae1fdde6f70",
"sha1": "361117d8f85c87d6bc99663c515032659a31a9a2",
"exts": []
},
{
"md5": "0000071cda07e58af7cf61e8819aa53d",
"exts": []
}
],
"exts": [
{
"key": "le",
"value": "0"
}
]
}请求地址
https://api.f.360.cn/files/std/v2/cloud_safe_info
请求方法
POST
请求参数
| 参数名 | 类型 | 位置 | 是否必填 | 示例值 | 说明 |
|---|---|---|---|---|---|
| data | Array(Object) | body | 是 | 查询的PC文件集合,单个请求最多携带20个PC文件,超过部分无效,只查前20个 | |
| data.md5 | string | body | 是 | 694aac16cef20a4324947ae1fdde6f70 | 查询PC文件的md5值 |
| data.sha1 | string | body | 否 | 361117d8f85c87d6bc99663c515032659a31a9a2 | 查询PC文件的sha1值,携带结果会更准确,但不能只有sha1,必须要有md5基础值 |
| data.exts | Array(Object) | body | 否 | 当前PC文件扩展字段,可为空 | |
| data.exts.key | string | body | 是 | 查询PC文件的扩展字段:字段名 | |
| data.exts.value | string | body | 是 | 查询PC文件的扩展字段:具体值 | |
| exts | Array(Object) | body | 否 | 本次请求全局扩展字段,可为空 | |
| exts.key | string | body | 是 | le | 本次请求全局扩展字段:字段名。 常见字段解释: le:客户端语言版本,响应报文 ext.type_desc 字段会有语言转换,不传默认为中文。映射表: |取值|国际标准|说明| |0|zh-CH|简体中文,默认| |1|zh-TW|繁体中文| |2|en|英文| |3|fr|法文| |4|es-419|巴西西班牙语| |5|pl|波兰语| |6|pt-BR|巴西葡萄牙语| |7|ru|俄语| |8|tr|土耳其| |9|pt|纯葡萄牙语| |10|es|纯西班牙语| |11|vi|越南语| |12|hi|印地语| |13|ar|阿语| |14|ko|韩语| |15|de|德语| |16|ja|日语| |
| exts.value | string | body | 是 | 0 | 本次请求全局扩展字段:具体值 |
参数请求示例
POST https://api.f.360.cn/files/std/v2/cloud_safe_info
请求body:
{
"data": [
{
"md5": "694aac16cef20a4324947ae1fdde6f70", // 必填
"sha1": "361117d8f85c87d6bc99663c515032659a31a9a2", // 选填
"exts": [ // 查询PC文件的扩展字段,可为空
{
"key": "",
"value": ""
}
// more ext
]
},
{
"md5": "0000071cda07e58af7cf61e8819aa53d", // 必填
"exts": [ // 查询PC文件的扩展字段,可为空
{
"key": "",
"value": ""
}
// more ext
]
}
// more sample
],
"exts": [ // 本次请求全局扩展字段,可为空
{
"key": "le", // le:客户端语言版本,响应报文全局 ext type_desc 字段会有语言转换,不传默认为中文。value 映射关系见字段 exts 描述
"value": "0"
}
// more ext
]
}
响应参数
| 名称 | 类型 | 示例值 | 描述 |
|---|---|---|---|
| code | integer | 0 | 响应状态码,0为正常 |
| data | object | ||
| data.results | Array(object) | 响应的PC文件集合 | |
| data.results.md5 | string | dd93825ca5bd3afda1c238ce2ded84e1 | 响应PC文件的md5值 |
| data.results.sha1 | string | 响应PC文件的sha1值,不一定返回此字段 | |
| data.results.info | object | 响应PC文件的详细信息 | |
| data.results.info.level | number | 70 | 响应的PC文件level级别,级别描述说明:10 纯白 白名单收集,20 白 回扫或者其他方式确认为白的,30 灰白 杀软扫描没报的,40 灰 未知,50 低疑似 误报率高的,60 高疑似 误报率低的,70 杀软确认报是病毒或木马黑。注意最高level等级就是70! |
| data.results.info.sub_level | number | 0 | 子类别 |
| data.results.info.malware | string | Generic/Backdoor.Nanocore.HnkASOYA | 恶意木马名称 |
| data.results.info.upload | string | 0 | 该样本是否需要上传,1:需要 2:不需要 |
| data.results.info.exts | Array(object) | 响应PC文件的扩展字段,可为空 | |
| data.results.info.exts.key | string | type_desc | 响应PC文件的扩展字段:字段名。 常见字段解释:type_desc:威胁分类描述,此字段对应的value值语言版本受请求全局ext里le字段控 |
| data.results.info.exts.value | string | 恶意软件是对病毒、木马、蠕虫、后门程序等危害用户计算机及数据安全的有害软件的统称,危害较大。恶意软件的意图通常是扰乱系统的正常工作、试图获取计算机系统和网络的资源以及在未获得用户的许可时得到其私人的敏感信息等 | 响应PC文件的扩展字段:具体值 |
| data.exts | |||
| data.exts.key | 本次响应全局扩展字段:字段名 | ||
| data.exts.value | 本次响应全局扩展字段:具体值 | ||
| msg | string | success | 响应状态信息,success为正常 |
请求示例
支持cUrl、Python、Java、PHP、Go语言的请求,示例如下
#!/usr/bin/env bash
set -euo pipefail
APPID="" # apikey
SECRET="" # salt
URL="https://api.f.360.cn/files/std/v2/cloud_safe_info"
BODY='{"data": [{"md5":"0000071cda07e58af7cf61e8819aa53d"}]}'
NONCE=$(printf '%08d' $((RANDOM % 100000000)))
TIMESTAMP=$(date +%s)
BODY_MD5=$(printf '%s' "$BODY" | openssl dgst -md5 -hex | awk '{print $NF}')
SIGNATURE=$(printf '%s' "${BODY_MD5}${APPID}${NONCE}${TIMESTAMP}${SECRET}" | openssl dgst -md5 -hex | awk '{print $NF}')
SIGNATURE=${SIGNATURE:16}
curl --location --request POST "$URL" \
--header "Content-Type: application/json" \
--header "X-360-Key: ${APPID}" \
--header "X-360-Nonce: ${NONCE}" \
--header "X-360-Timestamp: ${TIMESTAMP}" \
--header "X-360-Signature: ${SIGNATURE}" \
--data "${BODY}"# python3.6.8
# -*- coding:utf-8 -*—
import hashlib
import random
import time
import requests
def make_headers(appid, secret, body):
headers = {}
headers["X-360-Key"] = appid
headers["X-360-Nonce"] = str(random.randint(0, 99999999)).zfill(8)
headers["X-360-Timestamp"] = str(int(time.time()))
s = (
hashlib.md5(body.encode("utf8")).hexdigest()
+ headers["X-360-Key"]
+ headers["X-360-Nonce"]
+ headers["X-360-Timestamp"]
+ secret
)
md5 = hashlib.md5(s.encode("utf8")).hexdigest()
headers["X-360-Signature"] = md5[16:]
headers["Content-Type"] = "application/json"
return headers
def main():
appid = ".." # apikey
secret = ".." # salt
url = "https://api.f.360.cn/files/std/v2/cloud_safe_info"
body = '{"data": [{"md5":"0000071cda07e58af7cf61e8819aa53d"}]}'
res = requests.post(url, data=body, headers=make_headers(appid, secret, body))
print(res.text)
if __name__ == "__main__":
main()import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.concurrent.ThreadLocalRandom;
public class Demo {
static String md5(String input) throws Exception {
byte[] digest = MessageDigest.getInstance("MD5")
.digest(input.getBytes(StandardCharsets.UTF_8));
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
sb.append(String.format("%02x", b & 0xff));
}
return sb.toString();
}
public static void main(String[] args) throws Exception {
String appid = ""; // apikey
String secret = ""; // salt
String url = "https://api.f.360.cn/files/std/v2/cloud_safe_info";
String body = "{\"data\": [{\"md5\":\"0000071cda07e58af7cf61e8819aa53d\"}]}";
String nonce = String.format("%08d", ThreadLocalRandom.current().nextInt(100000000));
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
String signature = md5(md5(body) + appid + nonce + timestamp + secret).substring(16);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.header("X-360-Key", appid)
.header("X-360-Nonce", nonce)
.header("X-360-Timestamp", timestamp)
.header("X-360-Signature", signature)
.POST(HttpRequest.BodyPublishers.ofString(body, StandardCharsets.UTF_8))
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
System.out.println(response.body());
}
}<?php
// apikey
$appid = "";
// salt
$secret = "";
$url = 'https://api.f.360.cn/files/std/v2/cloud_safe_info';
$body = '{"data": [{"md5":"0000071cda07e58af7cf61e8819aa53d"}]}';
$nonce = str_pad((string) random_int(0, 99999999), 8, "0", STR_PAD_LEFT);
$timestamp = (string) time();
$signature = substr(md5(md5($body) . $appid . $nonce . $timestamp . $secret), 16);
$ch = curl_init($url);
$options = [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-360-Key: {$appid}",
"X-360-Nonce: {$nonce}",
"X-360-Timestamp: {$timestamp}",
"X-360-Signature: {$signature}",
],
];
$options[CURLOPT_POST] = true;
$options[CURLOPT_POSTFIELDS] = $body;
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
if ($response === false) {
echo curl_error($ch), PHP_EOL;
} else {
echo $response, PHP_EOL;
}
curl_close($ch);package main
import (
"bytes"
"crypto/md5"
"encoding/hex"
"fmt"
"io"
"math/rand"
"net/http"
"time"
)
func md5Hex(s string) string {
sum := md5.Sum([]byte(s))
return hex.EncodeToString(sum[:])
}
func main() {
appid := "" // apikey
secret := "" // salt
url := "https://api.f.360.cn/files/std/v2/cloud_safe_info"
body := []byte(`{"data": [{"md5":"0000071cda07e58af7cf61e8819aa53d"}]}`)
nonce := fmt.Sprintf("%08d", rand.Intn(100000000))
timestamp := fmt.Sprintf("%d", time.Now().Unix())
signature := md5Hex(md5Hex(string(body)) + appid + nonce + timestamp + secret)[16:]
req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-360-Key", appid)
req.Header.Set("X-360-Nonce", nonce)
req.Header.Set("X-360-Timestamp", timestamp)
req.Header.Set("X-360-Signature", signature)
resp, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
respBody, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(respBody))
}响应示例
业务正常响应
{
"code": "0",
"msg": "success",
"data": {
"results": [
{
"md5": "000006fdef3bad92b2d45add7ae8417c",
"sha1": "f29a12876c11327e24604b5b099575d3f0c77aaf",
"info": {
"exts": [
{
"key": "threat_type",
"value": "Trojan"
},
{
"key": "type_desc",
"value": "木马是一种伪装成正常文件的恶意程序,它们通过隐蔽的手段执行很多未经用户允许的操作,如:删除、阻止、修改或拷贝系统和用户数据,从而实现窃取用户隐私信息的目的。同时,它们还会导致系统和网络出现异常,影响用户正常使用电脑,给用户带来巨大损失。"
}
],
"level": 70,
"malware": "Win32/Trojan.Generic.HgIASRUA",
"sub_level": 0,
"upload": "0"
}
},
{
"md5": "dd93825ca5bd3afda1c238ce2ded84e1",
"info": {
"exts": [
{
"key": "threat_type",
"value": "Backdoor"
},
{
"key": "type_desc",
"value": "恶意软件是对病毒、木马、蠕虫、后门程序等危害用户计算机及数据安全的有害软件的统称,危害较大。恶意软件的意图通常是扰乱系统的正常工作、试图获取计算机系统和网络的资源以及在未获得用户的许可时得到其私人的敏感信息等。"
}
],
"level": 70,
"malware": "Generic/Backdoor.Nanocore.HnkASOYA",
"sub_level": 0,
"upload": "0"
}
}
],
"exts": []
}
}业务异常响应
{
"code": "AB13201",
"msg": "服务端内部错误,响应内容:[xxxxxx]"
}