如何获取JWT密钥及Windows服务器多环境密钥存储方法
JWT配置相关问题实操方案
1. JWT密钥的获取方式
JWT对称签名算法(新手最常用的HS256/HS512)所用的密钥不需要向任何第三方申请,自行生成符合长度要求的高熵随机字符串即可:
- 长度要求:HS256算法密钥至少16位(128位熵),推荐使用32位及以上长度,禁止使用有语义的短句、生日、常用密码这类低熵内容作为密钥。
- 本地快速生成可以直接在PowerShell中执行以下命令,直接输出符合要求的随机密钥:
# 生成32位随机字符串作为JWT密钥 -join ((1..32) | ForEach-Object {[char]((48..57)+(65..90)+(97..122) | Get-Random)})
如果使用RS256等非对称签名算法,需要自行生成RSA公私钥对,入门实现JWT认证优先用HS256即可,逻辑更简单。
2. 多环境密钥使用规则
三个环境必须使用完全独立的密钥,禁止跨环境复用:
- 开发环境(Dev):单独生成一个密钥,直接存在本地项目的
appsettings.Development.json配置文件中即可,该环境密钥无安全敏感性,哪怕泄露也不会造成实际影响。 - 测试环境(Test):单独生成专属密钥,存在测试环境部署包的
appsettings.Test.json中,仅开放给测试运维、相关测试开发人员访问权限,避免无关人员伪造测试身份。 - 生产环境(Prod):密钥必须单独生成,长度不低于32位,建议每3-6个月轮换一次,绝对不能明文写在任何随代码发布的appsettings.json文件中,绝对不能提交到代码版本库。
3. Windows服务器上JWT密钥的存储方案
生产环境禁止将密钥明文存储在站点根目录的配置文件中,Windows环境下按安全优先级推荐以下存储方式:
- 最高优先级:存储在Windows凭证管理器中。在服务器上打开「凭证管理器」-「Windows凭证」-「添加通用凭证」,将JWT密钥作为凭证值存入,代码通过Windows内置凭证API读取,普通站点进程、非管理员账号无法读取明文。
- 次优先级:存储在IIS站点专属环境变量中。如果是IIS部署的站点,直接在对应站点的配置编辑器中,找到
system.webServer/aspNetCore节点添加站点级环境变量存储密钥,配置内容会被IIS加密存储在服务器级配置文件中,仅服务器管理员可查看修改。 - 容器部署场景:将密钥配置为Windows容器的加密secret挂载,不要打包在镜像内置的配置文件里。
- 特殊情况必须存在配置文件的:使用Windows DPAPI对配置文件中的密钥字段做加密,站点运行时通过DPAPI解密读取,禁止明文存储。
注意:不管哪个环境,都不要把密钥硬编码在业务代码里,统一走配置读取逻辑,避免后续轮换密钥需要重新编译代码。
内容的提问来源于stack exchange,提问作者Nilesh
相关产品推荐
相关产品推荐

