免责声明
由于传播、利用本公众号夜组安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号夜组安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
朋友们现在只对常读和星标的公众号才展示大图推送,建议大家把夜组安全“设为星标”,否则可能就看不到了啦!
安全工具
01
介绍
JWT(JSON Web Token)是一种基于 JSON 的开放标准,用于在网络应用程序之间安全传输信息。它包含头部、载荷和签名三个部分,采用数字签名或消息认证码验证信息完整性和真实性。相较于传统的 Cookie 和 Session 认证方式,JWT 具有更节约资源、对移动端和分布式系统友好等优点。
02
环境要求
03
调用库
使用 CustomJWT jwt = new CustomJWT() 初始化这个库,配置声明等。
下面的示例使用各种支持的签名算法:
HS256 签名算法:
public static void main(String [] args){
try{
CustomJWT jwt = new CustomJWT(); //初始化
/*
准备Header
*/
String alg = "HS256"; //添加 Header
String type = "JWT"; //添加Header
String header = jwt.Header(alg, type); //给 header 添加进这两个元素
/*
准备Payload
*/
String[] payloadMessage = {
"sub", "1234567890", //1
"name", "John Doe", //2
"admin", "true", //3
"iat", Long.toString(1516239022L) //4
}; //准备好将 payload 的消息
/*
以下的isNumArray 这里的 `true` 是将 payload 里面的 `boolean` 类型和长整型生成对应的类型,
比如在 payload 里面的 `1` 这一行的注释输出的希望得到的是字符串类型,则直接输出 `false`,如果要输出为整数类型,则修改为 `true` 就行
比如这里的 `"admin", "true"`这里是将字符串来的 `true` 转变成 `boolean` 的类型.
显示将不带引号,同样的长整数类型同样也是这个道理,输出不为字符串类型
*/
boolean[] isNumArray = {false, false, true, true};
String payload = jwt.Payload(isNumArray, payloadMessage); //将消息添加到 Payload 部分
/*
准备Sign
*/
String key = "your-256-bit-secret"; //给下面的签名部分添加 secret
String sign = jwt.Signature(alg, header + "." + payload, key); //准备给 header 和 payload 生成签名
System.out.println(header + "." + payload + "." + sign); // JWT 生成,输出 Token
System.out.println(jwt.verifyHS(header + "." + payload + "." + sign, alg, key)); //输出 HS256 JWT 的验证,如果验证正确则输出true,否则输出false
}catch(Exception ex){
ex.printStackTrace();
}
}
2. PS256 签名算法:
public static void main(String [] args){
try{
CustomJWT jwt = new CustomJWT(2048); // RSA2048 初始化
/*
准备Header
*/
String alg = "PS256"; //添加 Header
String type = "JWT"; //添加Header
String header = jwt.Header(alg, type); //给 header 添加进这两个元素
/*
准备Payload
*/
String[] payloadMessage = {
"sub", "1234567890", //1
"name", "John Doe", //2
"admin", "true", //3
"iat", Long.toString(1516239022L) //4
}; //准备好将 payload 的消息
/*
以下的isNumArray 这里的 `true` 是将 payload 里面的 `boolean` 类型和长整型生成对应的类型,
比如在 payload 里面的 `1` 这一行的注释输出的希望得到的是字符串类型,则直接输出 `false`,如果要输出为整数类型,则修改为 `true` 就行
比如这里的 `"admin", "true"`这里是将字符串来的 `true` 转变成 `boolean` 的类型.
显示将不带引号,同样的长整数类型同样也是这个道理,输出不为字符串类型
*/
boolean[] isNumArray = {false, false, true, true};
String payload = jwt.Payload(isNumArray, payloadMessage); //将消息添加到 Payload 部分
/*
准备Sign
*/
String sign = jwt.Signature(alg, header + "." + payload); //准备给 header 和 payload 生成签名
System.out.println("Private Key (PEM):");
System.out.println(jwt.getPrivateKeyPEM()); //输出 RSAPSSSHA256withMGF1 的私钥签名
System.out.println();
System.out.println("Public Key (PEM):");
System.out.println(jwt.getPublicKeyPEM()); //输出 RSAPSSSHA256withMGF1 的公钥签名
System.out.println();
System.out.println(header + "." + payload + "." + sign); // JWT 生成,输出 Token
System.out.println(jwt.verifyPS256(header + "." + payload + "." + sign, sign)); //输出 PS256 JWT 的验证,如果验证正确则输出true,否则输出false
}catch(Exception ex){
ex.printStackTrace();
}
}
3. RS256 签名算法:(与 PS256 差不多)
public static void main(String [] args){
try{
CustomJWT jwt = new CustomJWT(2048); // RSA2048 初始化
/*
准备Header
*/
String alg = "RS256"; //添加 Header
String type = "JWT"; //添加Header
String header = jwt.Header(alg, type); //给 header 添加进这两个元素
/*
准备Payload
*/
String[] payloadMessage = {
"sub", "1234567890", //1
"name", "John Doe", //2
"admin", "true", //3
"iat", Long.toString(1516239022L) //4
}; //准备好将 payload 的消息
/*
以下的isNumArray 这里的 `true` 是将 payload 里面的 `boolean` 类型和长整型生成对应的类型,
比如在 payload 里面的 `1` 这一行的注释输出的希望得到的是字符串类型,则直接输出 `false`,如果要输出为整数类型,则修改为 `true` 就行
比如这里的 `"admin", "true"`这里是将字符串来的 `true` 转变成 `boolean` 的类型.
显示将不带引号,同样的长整数类型同样也是这个道理,输出不为字符串类型
*/
boolean[] isNumArray = {false, false, true, true};
String payload = jwt.Payload(isNumArray, payloadMessage); //将消息添加到 Payload 部分
/*
准备Sign
*/
String sign = jwt.Signature(alg, header + "." + payload); //准备给 header 和 payload 生成签名
System.out.println("Private Key (PEM):");
System.out.println(jwt.getPrivateKeyPEM()); //输出 SHA256withRSA 的私钥签名
System.out.println();
System.out.println("Public Key (PEM):");
System.out.println(jwt.getPublicKeyPEM()); //输出 SHA256withRSA 的公钥签名
System.out.println();
System.out.println(header + "." + payload + "." + sign); // JWT 生成,输出 Token
System.out.println(jwt.verifyRS256(header + "." + payload + "." + sign, sign)); //输出 RS256 JWT 的验证,如果验证正确则输出true,否则输出false
}catch(Exception ex){
ex.printStackTrace();
}
}
4. ES256 签名算法:(ECDSA 椭圆算法)
public static void main(String [] args){
try{
CustomJWT jwt = new CustomJWT(256); // ECDSA 初始化,这里提供的有256,384,521
/*
准备Header
*/
String alg = "ES256"; //添加 Header
String type = "JWT"; //添加Header
String header = jwt.Header(alg, type); //给 header 添加进这两个元素
/*
准备Payload
*/
String[] payloadMessage = {
"sub", "1234567890", //1
"name", "John Doe", //2
"admin", "true", //3
"iat", Long.toString(1516239022L) //4
}; //准备好将 payload 的消息
/*
以下的isNumArray 这里的 `true` 是将 payload 里面的 `boolean` 类型和长整型生成对应的类型,
比如在 payload 里面的 `1` 这一行的注释输出的希望得到的是字符串类型,则直接输出 `false`,如果要输出为整数类型,则修改为 `true` 就行
比如这里的 `"admin", "true"`这里是将字符串来的 `true` 转变成 `boolean` 的类型.
显示将不带引号,同样的长整数类型同样也是这个道理,输出不为字符串类型
*/
boolean[] isNumArray = {false, false, true, true};
String payload = jwt.Payload(isNumArray, payloadMessage); //将消息添加到 Payload 部分
/*
准备Sign
*/
String sign = jwt.Signature(alg, header + "." + payload); //准备给 header 和 payload 生成签名
System.out.println("Private Key (PEM):");
System.out.println(jwt.getPrivateKeyPEM()); //输出 SHA256withECDSA 的私钥签名
System.out.println();
System.out.println("Public Key (PEM):");
System.out.println(jwt.getPublicKeyPEM()); //输出 SHA256withECDSA 的公钥签名
System.out.println();
System.out.println(header + "." + payload + "." + sign); // JWT 生成,输出 Token
System.out.println(jwt.verifyES256(header + "." + payload + "." + sign, sign)); //输出 RS256 JWT 的验证,如果验证正确则输出true,否则输出false
}catch(Exception ex){
ex.printStackTrace();
}
}
03
工具下载
点击关注下方名片进入公众号
回复关键字【231115】获取下载链接
04
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...