【Java代码审计】失效认证及不安全随机数篇

这篇具有很好参考价值的文章主要介绍了【Java代码审计】失效认证及不安全随机数篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.不安全的随机数生成器

根据密码学原理,随机数生成器分为以下三类:

1、统计学伪随机数生成器(PRNG):伪随机数生成器从一个初始化的种子值开始计算得到序列,从种子开始,然后从种子中计算出后续值,当种子确定后生成的随机数也是确定的,但其输出结果很容易预测,因此容易复制数值流

2、密码学安全随机数生成器(CSPRNG):密码学安全伪随机性是统计学伪随机数生成器的一个特例,给定随机样本的一部分和随机算法,不能有效地演算出随机样本的剩余部分

3、真随机数生成器:其定义为随机样本不可重现。实际上只要给定边界条件,真随机数并不存在。可是如果产生一个真随机数样本的边界条件十分复杂且难以捕捉(比如计算机当地的本底辐射波动值),则可以认为用这个方法演算出来了真随机数

使用计算机产生真随机数的方法是获取CPU频率与温度的不确定性,以及统计一段时间内的运算次数每次都会产生不同的值,系统时间的误差以及声卡的底噪等。在实际应用中往往使用伪随机数就足够了。计算机或计算器产生的随机数有很长的周期性。实际上它们不真正地随机,因为它们是可以计算出来的,但是它们具有类似于随机数的统计特征。这样的发生器称为伪随机数发生器

Java中的“java.util.Random”工具类LCG线性同余法伪随机数生成器,可以根据种子和算法生成随机数。此算法的缺陷就是可预测性,攻击者可能会猜测将要生成的下一个值,并使用此猜测来模拟其他用户或访问敏感信息

【Java代码审计】失效认证及不安全随机数篇,# Code Audit,java,安全

java.util.Random”不是加密安全的。可以使用SecureRandom来获取密码安全的伪随机数生成器

【Java代码审计】失效认证及不安全随机数篇,# Code Audit,java,安全

使用SecureRandom生成伪随机,因为SecureRandom使用鼠标点击、键盘点击等等这些随机事件作为种子,故其生成的随机数列完全不同,安全性要高,所以建议使用“java.Security.SecureRandom”工具类来代替“java.util.Random”工具类


2.JWT弱加密

JSON Web Token 为开发人员提供了几种对有效负载声明进行数字签名的方法。这确保了数据完整性和强大的用户身份验证,每当开发人员使用 HMAC 签名时,他们都需要提供一个密钥,用于签名和验证令牌。如果这个密钥不够强大,整个签名可能会被泄露,造成越权操作等危害

漏洞代码:

// 设置了简单的密钥,可爆破从而进行伪造jwt
private static final String SECRET = "123456";
private static final String B64_SECRET = Base64.getEncoder().encodeToString(SECRET.getBytes(StandardCharsets.UTF_8));

public static String generateTokenByJjwt(String userId) {
    return Jwts.builder()
        .setHeaderParam("typ", "JWT")
        .setHeaderParam("alg", "HS256")
        .setIssuedAt(new Date())
        .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
        .claim("userid", userId)
        .signWith(SignatureAlgorithm.HS256, B64_SECRET)
        .compact();
}

通过破解JWT密钥啊,攻击者可以轻松获取当前的用户信息等:

【Java代码审计】失效认证及不安全随机数篇,# Code Audit,java,安全

防御方法:

确保使用强大的、不可预测的密钥来计算服务器上的 HMAC 签名。我们建议使用长度至少为 32 字节的随机生成值。

例如:

// 设置复杂的密钥
private static final String SECRET = "17245b290622c65bcc785ce3dd97dab3";

3.验证码复用

验证码反复利用,可以直接进行暴力破解

一般来说,验证码是与Session绑定的,Session生成时,也伴随着验证码的生成和绑定,在访问页面时,接口的请求和验证码的生成通常是异步进行的,这使得两个功能变得相对独立。也就意味着我们如果仅请求接口,而不触发验证码的生成,那么验证码就不会变化。 并且在考虑安全时,开发人员的关注点往往在 验证码校验是否通过,通过则进入业务流程,不通过则重新填写,而忽视了这个用户是否按照既定的业务流程在走(接口访问与验证码生成是否同时进行),验证码是否被多次使用了

例如,如下代码没有在用户鉴权失败时刷新验证码:

 // 未清除session中的验证码,导致可复用
 if (!CaptchaUtil.ver(captcha, request)) {
     model.addAttribute("msg", "验证码不正确");
     return "login";
 }

正确的方法是,不管验证码是不是输入正确,都应该及时销毁验证码文章来源地址https://www.toymoban.com/news/detail-794021.html

// 不管账号正确与否,一次请求后都清掉验证码
request.getSession().removeAttribute("captcha");

到了这里,关于【Java代码审计】失效认证及不安全随机数篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 商用密码产品认证中的随机数(二)

    现行密码标准体系中包括三类随机数相关标准:框架类标准、设计类标准和检测类标准。 框架类标准为GM/T 0103《随机数发生器总体框架》 设计类标准为用于指导随机数发生器的技术设计,包括GM/T 0078《密码随机数生成模块设计指南》、《物理混沌随机数发生器设计指南》和

    2024年02月05日
    浏览(54)
  • 一文详解安全随机数

    本文分享自华为云社区《【安全攻防】深入浅出实战系列专题-安全随机数》,作者: MDKing 。 使用随机数可分类安全场景跟非安全场景。非安全场景需要生成的越快越好。安全场景使用的随机数必须足够安全,保证不能被预测到。 常见的非安全场景: 数据的索引号、标识;

    2024年02月05日
    浏览(45)
  • 第157篇 合约安全-随机数

    智能合约的开发中常常会用到随机数,例如 Lottery 和现在流行的 NFT 数字藏品的属性等都需要用到随机数。目前来说常见的随机数获取有两种:使用区块变量生成随机数,使用预言机来生成随机数。 使用 区块变量 生成随机数,常见的区块变量有: block.basefee(uint):当前区块的

    2024年02月06日
    浏览(35)
  • 前端解决客户端不安全随机数

    前端项目在安全漏洞扫描的时候,爆出了客户端不安全随机数的问题,看了下代码是因为使用了 Math.random() 生成随机数造成的。 百度了一下,math.random()并不是真的随机数,而是伪随机数! 原因 Math.random() 函数是 JavaScript 内置的一个函数,它用于生成一个 0 到 1(包括0,不包括

    2024年02月16日
    浏览(44)
  • SM2签名算法中随机数K的随机性对算法安全的影响

            一、构造如下SM2签名算法过程1         Sig1 r1 =         F2BFC778C66127C74E3613FAA1AB6E207059740B317597A78BBFCDF58AED0A51         Sig1 s1 = 4FC719D00334CCC23098036DEEAA71DB464A076EFA79283389D3414D70659E88         私钥d = B3124DC843BB8BA61F035A7D0938251F5DD4CBFC96F5453B130D890A1CDBAE32         公钥

    2024年02月03日
    浏览(55)
  • 解决Fortify漏洞:Insecure Randomness(不安全随机数)

           Fortify漏洞:Insecure Randomness(不安全随机数)指的是代码中使用了不安全或弱随机数生成器导致的安全漏洞。随机数在密码学应用、加密和解密等领域中经常被使用,如果生成的随机数不够随机或不够复杂,则会使得攻击者可以轻易地猜出生成的随机数,从而对系统

    2024年02月10日
    浏览(51)
  • 【Java】Java如何生成随机数?

    我们在学习 Java 基础时就知道可以生成随机数,可以为我们枯燥的学习增加那么一丢丢的乐趣。本文就来介绍 Java 随机数。 在 Java 中使用 Random 工具类来生成随机数,该类在 java.util 包下,在 JDK1.0 版本就存在了。Random 单词本身就是随机、随意、任意的意思。Random 是一个普通

    2024年02月12日
    浏览(42)
  • java生成随机数

       bound 必须是正数。 以下代码生成的是 0 到 30 的随机数。 生成区间的随机数:[最小值,最大值] 学的不是技术,更是梦想!!!

    2024年02月07日
    浏览(62)
  • C语言生成随机数【简易抽卡代码为例】

    本文将详细解释如何在C语言中生成随机数,并介绍应用的小技巧 c语言生成一个真正的随机数需要用到三个函数: rand()、srand()和time()。 函数介绍 头文件 : #includestdlib.h 函数声明 : int rand(void) 作用 ; 生成一个伪随机数序列,随机数取值范围是0~RAND_MAX PS - RAND_MAX其实是一个宏

    2024年02月04日
    浏览(49)
  • java生成指定区间的随机数

    随机数 例:编写程序随机生成k个位于[m,n]区间的整数,对这k个数据进行升序排序并输出。 在使用Java生成随机数的时候,有一些注意事项需要注意,下面是一些常见的问题和解决方案: 1. 生成随机数时,应该使用Java的 Random 类,而不是 Math.random() 方法。原因是, Math.rando

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包