우당탕탕 좌충우돌 개발일기

스프링부트 SecureRandom 예제 본문

Programming/삽질기록

스프링부트 SecureRandom 예제

성동구불주먹 2023. 11. 20. 16:32

 

관리자페이지 생성 후 관리자 등록 시, 임의의 비밀번호를 생성해서 발급해주려 한다.

임의의 난수를 만드는 함수로는 Random, SecureRandom이 있는데 그중에서도 SecureRandom이 암호적으로 더 강력한 난수를 만들어주는 클래스라고 하기에 사용해 보았다.

 

 

✨ SecureRandom 관련 내용은 하단 링크 참조 

https://docs.oracle.com/javase/8/docs/api/java/security/SecureRandom.html

 

SecureRandom (Java Platform SE 8 )

This class provides a cryptographically strong random number generator (RNG). A cryptographically strong random number minimally complies with the statistical random number generator tests specified in FIPS 140-2, Security Requirements for Cryptographic Mo

docs.oracle.com

 

 


 

 

1. 우선 util(공통으로 쓰일 클래스들이 들어갈 곳) 패키지에 SecureRandom함수를 사용해서 RandomUtil 클래스를 생성

2. 생성한 RandomUtil 클래스를 Controller에서 RequestMapping 해준다.

3. 화면단(html)에서 script부분에 fetch로 해당 메서드를 호출한다. 아래는 예제 코드이다.

 

 

 

RandomUtil.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.security.SecureRandom;

@Component
public class RandomUtil {

    private static String DATA = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    private static SecureRandom random = new SecureRandom();

    /** 랜덤 문자열을 생성한다 **/
    @Autowired
    public static String generate(int length) {
        if (length < 1) {
            throw new IllegalArgumentException("길이는 1자리 이상이어야 합니다.");
        }

        StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            sb.append( DATA.charAt(random.nextInt(DATA.length())));
        }
        return sb.toString();
    }
}

 

 

SystemController.java

@Controller
@RequestMapping("/system")
public class SystemController {

    @Autowired
    private RandomUtil randomUtil;


    @RequestMapping("/getRandomString")
    @ResponseBody
    public Map<String, Object> getRandomString() {
        String randomKey = randomUtil.generate(10);
        
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("randomKey", randomKey);
        
        return map;
    }
}

 

 

register.html

<div>
    <label for="password">비밀번호<sup class="text-danger">*</sup></label>
    <button type="button" onclick="generatePassword()">임시 비밀번호 생성</button>
    <input type="text" id="password" name="password" placeholder="임시 비밀번호 생성 버튼을 클릭해주세요" required readonly>
</div>



<script>
    function generatePassword() {
        ComUtils.callFetch('/system/getRandomString')
            .then(data => {
                var randomString = data.randomKey;
                document.getElementById('password').value = randomString;
            })
            .catch(error => {console.error('Error:', error)});
    }
    
</script>

 

반응형