OkHttp · 密码资产盘点
仓库 square/okhttp · TLS 客户端,密码使用高度集中 · 扫描于
这份报告在说什么
静态扫描只回答一件事:这个仓库里,密码算法和密码库出现在哪里、用的是什么。
它不回答"有没有漏洞",也不回答"是不是真的暴露在生产环境"。
「已确认」= 算法名能在代码里确定(字面量,或本文件内唯一的常量赋值);
「疑似」= 找到了密码调用,但算法名来自变量、配置或依赖注入,静态无法确定。
发现明细(按文件顺序,最多 15 条 / 共 3 条)
| 风险 | 算法 | 位置 | 置信度 | 建议动作 |
| 信息 |
TLS |
samples/guide/src/main/java/okhttp3/recipes/CustomCipherSuites.java:80 |
已确认 |
仅记录 |
| 信息 |
unknown |
samples/static-server/src/main/java/okhttp3/sample/SampleServer.java:135 |
疑似 |
仅记录 |
| 信息 |
TLS |
samples/static-server/src/main/java/okhttp3/sample/SampleServer.java:147 |
已确认 |
仅记录 |
本次没扫什么(这一节比上面重要)
- android-test/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- android-test-app/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- build-logic/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- mockwebserver/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- mockwebserver-deprecated/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- mockwebserver-junit4/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- mockwebserver-junit5/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- native-image-tests/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- okcurl/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- okhttp-brotli/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- okhttp-coroutines/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- okhttp-dnsoverhttps/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- okhttp-hpacktests/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- okhttp-idna-mapping-table/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- okhttp-java-net-cookiejar/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- okhttp-logging-interceptor/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- okhttp-osgi-tests/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- okhttp-sse/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- okhttp-testing-support/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- okhttp-tls/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- okhttp-urlconnection/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- okhttp-zstd/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- samples/android/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- samples/compare/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- samples/crawler/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- samples/guide/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- samples/simple-client/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- samples/slack/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- samples/static-server/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- samples/tlssurvey/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- samples/unixdomainsockets/build.gradle.kts:有 dependencies 块但没解析出 group:artifact 形态的坐标(v0.1 只认单行声明,不展开变量与依赖约束)
- 源码级判定只覆盖 Java:扫描 *.java 与 pom.xml;其他语言的源码只计入 target.languages,不做 API 级判定(不是「扫了没发现」)。
- 依赖级判定覆盖 pom.xml、build.gradle(.kts)、go.mod、requirements.txt、package.json、package-lock.json、yarn.lock、CMakeLists.txt、vcpkg.json、conanfile.txt,且只认已知密码库表:其余依赖不会被报出来,所以「没报」不等于「没用密码」。
- 证书只解析公钥与元数据(主体/签发者 CN、签名算法、公钥算法与位数、有效期);私钥文件只识别 PEM 块类型与算法,不解析私钥内容,也不输出任何密钥字节。
- PKCS#12(.p12/.pfx)与 JKS(.jks/.keystore)不解析、不解密,只报一条 info 级「存在密钥容器,需人工核查」。
- 证书/私钥是文件级资产:evidence.line 固定为 1,不在文件内定位行号;依赖级 evidence.line 固定为 0。
- pom.xml 的 parent 继承未解析:子模块未显式声明的 version 可能留空或保留 ${...} 占位符,dependencyPath 只含直接坐标。
- pom.xml 只取 <dependencies> 下的直接子节点;<dependencyManagement>、<profiles>、BOM import 都不参与判定。
- 源码按行扫描:跨行书写的调用(括号内参数换行)判为 likely,不判 confirmed。
- 已跳过注释与字符串字面量内部的匹配(跨行状态机);但 Java 15 的 text block("""...""")与 Unicode 转义仍可能判错。
- 密钥长度只在 KeyPairGenerator 命中行及其后 3 行内查找 initialize(<数字>),其他算法不推断长度;证书的位数来自公钥本身。
- 依赖级发现不映射清单行号,因此 SARIF 里这类结果不带 region。
- 符号链接不跟随,扫描范围不会跑出扫描根。
- 默认排除目录:target、build、.git、node_modules(--exclude 在此之上叠加)。
- 非 UTF-8 源文件按原始字节读取,JSON 输出时非法字节会被替换为 U+FFFD。
- risk.categories 允许为空数组(= 无已知风险,此时 risk.level 必须是 info):后量子算法、TLS1.2/1.3 等无风险项输出空数组,不自造枚举值。