랜덤 비밀번호 만들기 - laendeom bimilbeonho mandeulgi

파이썬 - 랜덤 비밀번호 생성기 (Random Password Generator)

간만에 파이썬 포스팅 입니더. 파이썬으로 랜덤으로 비밀번호 password 를 생성하는 프로그램을 만들어 봤음. 입력값은 '패스워드 길이 , 그리고 패스워드 몇개? 만 넣었음.

이것도 디테일하게 들어가면 뭐 대문자를 넣을건지 말건지, 소문자를 넣을건지 말건지, 숫자, 특수문자를 넣을건지 말건지, 등등 밑도 끝도 없이 업데이트 할 수 있음.

하지만 뭐 팔려고 만드는것도 아니고 연습용 이기 때문에 그냥 대충 형태만 갖추는 정도로만 만족하려함. 더 세세하게 옵션을 주고 수정하고 싶으면 직접 받아서 그렇게 하셔도 됨.

참고한 프로그램은 크롬의 웹 익스텐션인 Lastpass다. 여러 사이트의 id/password를 관리해주는 툴이다. 원클릭으로 로그인 되게 해주는 기능이 아주 좋다. 이 lastpass 계정이 털리면 내 비밀번호도 싹다 털리는 리스크가 있다.

무료버젼은 한개의 브라우저만 사용가능하다. 유료로 결제하면 여러개의 브라우저, 모바일 브라우저에 사용가능하다.

네이버웨일 브라우저를 주로 쓰는데 뭐 아직까지는 굳이 유료버젼을 구매하지 않아도 될거 같아서 나는 무료버젼을 사용하고 있다. 네이버 웨일 브라우저에도 아이디/암호 저장해주는 기능이 있긴한데, 계속쓰고 있었던 툴이라.. 조금씩 옮겨오고 있긴 하다.

자자. 프로그래밍 하자.

일단 패스워드를 만들 리소스부터 리스트로 만든다. 문자로 하나씩 쪼개서 대문자,소문자,특수문자,숫자 리스트에 넣어서 초기화 해준다. 그리고 각 리스트를 passList로 다시한번 선언해준다. 접근을 쉽게 하기 위해서.

upper = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] lower = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] symbol = ['!', '@', '#', '$', '%'] number = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] passList=[upper,lower,symbol,number]

패스워드 길이와 , 몇개의 패스워드 샘플을 보여줄지 입력 받아서 변수에 저장해둔다.

사실 이렇게 한방에 특수문자,숫자,대소문자 구분없이 길이 만큼 무작위로 뽑을 거면 데이터를 굳이 나눌 필요도 없긴 했다. 그냥 하나의 리스트로 모았으면 오히려 쉬웠겠지만... 그래도 나눠놓으면 나중에 언젠가 쓸모가 있을지도(개발자의 확장 욕심.)

그러나 실무에서도 예상해놨던대로 확장이 되는경우는 잘 없었다. 왜 슬픈예감은 틀린적이 없고 희망적인 예상은 맞는적이 없지..?

암튼 랜덤 패스워드를 추출하는 함수를 만들어준다. 랜덤 돌면서 숫자하나(n)를 뽑는다. (대문자,소문자,특수문자,숫자 의 인덱스 중 하나)

그 뽑은 숫자를 passList의 인덱스로 넣어서 그 중에 하나의 문자열을 가져온다. random.choice() 는 사랑이다.

그리고 가져온 문자열을 원하는 길이 (입력받은 값) 만큼 반복하면서 passStr에 계속 붙여준다.

함수가 제대로 동작하는지 테스트 해보자. 잘되네.

그럼 이제 요전에 입력받은 pwExampleCount만큼 for문을 돌 수 있게 for문의 range에 pwExampleCount을 넣어주자. pwExampleCount만큼 돌면서 함수를 호출해주면 pwExampleCount만큼의 패스워드가 생성된다!

upper = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] lower = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] symbol = ['!', '@', '#', '$', '%'] number = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] passList=[upper,lower,symbol,number] import random as rd pwLength = int( input("패스워드 길이=")) pwExampleCount =int( input("패스워드 샘플 몇개 ?=")) def getRandomPassword( length ): passStr='' for v in range(length): n = rd.randint(0,3) passStr += rd.choice( passList[n] ) return passStr for i in range(pwExampleCount): print( f"ex{i+1}) {getRandomPassword pwLength)}" )

희. 이렇게 파이썬으로 '무작위 비밀번호 생성기' 만들기 설명을 마친다. 새로운 비밀번호를 생성하고 싶을때 사용하면 유용할것 같다.

읽어주셔서 감사하다. 이상한거나 질문은 댓글로 달아달라. :D

#파이썬 #비밀번호 #암호화 #설치

같이 보면서 만들어보면 더욱 재밌는 파이썬 코딩 놀이들...

이 게시물은 Java에서 원하는 길이의 강력한 임의의 영숫자 암호를 생성하는 방법에 대해 설명합니다.

1. 사용 SecureRandom.nextInt(…) ~와 함께 StringBuilder

간단한 솔루션은 정의된 ASCII 범위에서 문자를 무작위로 선택하고 원하는 길이의 문자열을 구성하는 것입니다. 임의의 영숫자 암호를 구성하려면 ASCII 범위가 숫자, 대문자 및 소문자로 구성되어야 합니다.

다음은 아이디어를 보여주기 위한 간단한 Java 프로그램입니다. SecureRandom 클래스는 위에 사용됩니다. Random 암호학적으로 강력한 난수 생성기를 보장하는 클래스입니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

importjava.security.SecureRandom;

classMain

{

    // 특정 길이의 임의의 영숫자 비밀번호를 생성하는 메소드

    publicstaticString generateRandomPassword(intlen)

    {

        // ASCII 범위 – 영숫자(0-9, a-z, A-Z)

        finalStringchars= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

        SecureRandom random= newSecureRandom();

        StringBuilder sb=newStringBuilder();

        // 루프의 각 반복은 주어진 문자에서 무작위로 문자를 선택합니다.

        // ASCII 범위를 `StringBuilder` 인스턴스에 추가합니다.

        for(inti= 0;i<len;i++)

        {

            intrandomIndex= random.nextInt(chars.length());

            sb.append(chars.charAt(randomIndex));

        }

        return sb.toString();

    }

    public staticvoidmain(String[]args)

    {

        intlen=10;

        System.out.println(generateRandomPassword(len));

    }

}

다운로드  코드 실행

 
다음은 Stream API를 사용하는 동등한 버전입니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

importjava.security.SecureRandom;

import java.util.stream.Collectors;

import java.util.stream.IntStream;

classMain

{

    // 특정 길이의 임의의 영숫자 비밀번호를 생성하는 메소드

    publicstaticString generateRandomPassword(intlen)

    {

        // ASCII 범위 – 영숫자(0-9, a-z, A-Z)

        finalStringchars= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

        SecureRandom random= newSecureRandom();

        // 루프의 각 반복은 주어진 문자에서 무작위로 문자를 선택합니다.

        // ASCII 범위를 `StringBuilder` 인스턴스에 추가합니다.

        returnIntStream.range(0, len)

                .map(i-> random.nextInt(chars.length()))

                .mapToObj(randomIndex-> String.valueOf(chars.charAt(randomIndex)))

                .collect(Collectors.joining());

    }

    publicstaticvoid main(String[]args)

    {

        intlen=10;

        System.out.println(generateRandomPassword(len));

    }

}

다운로드  코드 실행

2. 사용 SecureRandom.ints(…) + 스트림

Java 8 이상에서는 SecureRandom.ints(…) 메서드는 지정된 범위 내에서 의사 난수 값의 스트림을 효과적으로 반환하는 데 사용할 수 있습니다. 생성된 의사 난수 값을 영숫자 값으로 제한하려면 filter(…) 스트림 방식. 필터링된 영숫자 의사 난수 값을 원하는 길이로 제한하려면 limit(…) 방법. 마지막으로 결과 스트림에서 값을 수집하고 문자열을 구성합니다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

importjava.security.SecureRandom;

classMain

{

    // 특정 길이의 임의의 영숫자 비밀번호를 생성하는 메소드

    publicstaticString generateRandomPassword(intlen,intrandNumOrigin, intrandNumBound)

    {

        SecureRandom random =newSecureRandom();

        return random.ints(randNumOrigin,randNumBound+ 1)

                .filter(i-> Character.isAlphabetic(i)|| Character.isDigit(i))

                .limit(len)

                .collect(StringBuilder::new,StringBuilder::appendCodePoint,

                        StringBuilder::append)

                .toString();

    }

    public staticvoidmain(String[]args)

    {

        intlen=10;

        intrandNumOrigin=48,randNumBound =122;

        System.out.println(generateRandomPassword(len, randNumOrigin,randNumBound));

    }

}

다운로드  코드 실행

 
위의 솔루션은 원하는 길이의 강력한 임의의 영숫자 암호를 생성합니다. 숫자만 생성하도록 코드를 더욱 단순화할 수 있습니다. (0-9) 비밀번호, 비밀번호 모두 대문자 (A-Z) 문자 또는 모두 소문자 (a-z) 문자 또는 일부 ASCII 범위에 속하는 기타 문자.

예를 들어, 모두 소문자로 된 비밀번호를 생성하려면 범위를 다음과 같이 설정하십시오. 97-122 (ASCII 값의 'a'-'z').

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

importjava.security.SecureRandom;

import java.util.stream.Collectors;

classMain

{

    // 특정 길이의 임의의 영숫자 비밀번호를 생성하는 메소드

    publicstaticString generateRandomPassword(intlen,intrandNumOrigin, intrandNumBound)

    {

        SecureRandom random =newSecureRandom();

        return random.ints(len,randNumOrigin,randNumBound +1)

                    .mapToObj(i-> String.valueOf((char)i))

                    .collect(Collectors.joining());

    }

    publicstaticvoid main(String[]args)

    {

        intlen=10;

        int randNumOrigin=97,randNumBound= 122;

        System.out.println(generateRandomPassword(len, randNumOrigin,randNumBound));

    }

}

다운로드  코드 실행

3. Apache Commons 텍스트 사용

여러 타사 라이브러리에서 임의 값으로 작업하기 위한 유틸리티 메서드를 제공합니다. Apache Commons Text 라이브러리를 선호하는 경우 RandomStringGenerator 클래스는 임의의 유니코드 문자열을 생성할 수 있습니다. 해당 인스턴스는 빌더 클래스를 사용하여 생성됩니다.

⮚ 사용 withinRange(…) ~와 함께 filteredBy(…):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

importorg.apache.commons.text.CharacterPredicates;

importorg.apache.commons.text.RandomStringGenerator;

classMain

{

    // 특정 길이의 임의의 영숫자 비밀번호를 생성하는 메소드

    publicstatic StringgenerateRandomPassword(intlen,int randNumOrigin,intrandNumBound)

    {

        RandomStringGenerator generator=newRandomStringGenerator.Builder()

                .withinRange(randNumOrigin,randNumBound)

                .filteredBy(CharacterPredicates.ASCII_ALPHA_NUMERALS)

                .build();

        return generator.generate(len);

    }

    publicstaticvoidmain(String[] args)

    {

        intlen= 10;

        intrandNumOrigin= '0',randNumBound='z';

        System.out.println(generateRandomPassword(len, randNumOrigin,randNumBound));

    }

}

코드 다운로드

 
RandomStringGenerator 인스턴스는 기본 RNG(난수 생성기)를 사용합니다. 다음을 호출하여 사용자 지정 RNG를 사용할 수 있습니다. Builder.usingRandom(…) 방법은 아래와 같습니다.

publicstaticStringgenerateRandomPassword(int len,intrandNumOrigin,intrandNumBound)

{

    // 임의성을 위해 Apache Commons RNG 사용

    SecureRandom rng=new SecureRandom();

    RandomStringGenerator generator= newRandomStringGenerator.Builder()

            .withinRange(randNumOrigin,randNumBound)

            .filteredBy(CharacterPredicates.ASCII_ALPHA_NUMERALS)

            .usingRandom(rng::nextInt)

            .build();

    return generator.generate(len);

}

⮚ 사용 selectFrom(…):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

importorg.apache.commons.text.RandomStringGenerator;

classMain

{

    // 특정 길이의 임의의 영숫자 비밀번호를 생성하는 메소드

    // Apache Commons Text `RandomStringGenerator` 사용

    publicstaticStringgenerateRandomPassword(intlen)

    {

        // 영숫자 ASCII 범위 제공(0-9, a-z, A-Z)

        finalString chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

        RandomStringGenerator randomStringGenerator=newRandomStringGenerator.Builder()

                .selectFrom(chars.toCharArray())

                .build();

        return randomStringGenerator.generate(len);

    }

    publicstaticvoidmain(String[] args)

    {

        intlen= 10;

        System.out.println(generateRandomPassword(len));

    }

}

코드 다운로드

4. Apache Commons Lang 사용하기

우리는 또한 사용할 수 있습니다 RandomStringUtils Apache Commons Lang 라이브러리의 클래스. 다음과 같은 여러 가지 방법을 제공합니다. randomAlphabetic, randomAlphanumeric, randomNumeric등을 사용하여 임의의 문자열을 만듭니다.

예를 들어, randomAlphanumeric(…) 지정된 길이의 임의의 영숫자 문자열을 생성합니다.

importorg.apache.commons.lang3.RandomStringUtils;

classMain

{

    // 특정 길이의 임의의 영숫자 비밀번호를 생성하는 메소드

    // Apache Commons Lang `RandomStringUtils` 사용

    publicstaticStringgenerateRandomPassword(int len){

        return RandomStringUtils.randomAlphanumeric(len);

    }

    publicstaticvoidmain(String[] args)

    {

        intlen= 10;

        System.out.println(generateRandomPassword(len));

    }

}

코드 다운로드

 
지정된 문자에서 임의의 문자열을 명시적으로 구성하려면 다음을 호출하십시오. random(…) 방법.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

importorg.apache.commons.lang3.RandomStringUtils;

classMain

{

    // 특정 길이의 임의의 영숫자 비밀번호를 생성하는 메소드

    // Apache Commons Lang `RandomStringUtils` 사용

    publicstaticStringgenerateRandomPassword(intlen)

    {

        finalStringchars= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

        return RandomStringUtils.random(len,chars);

    }

    publicstaticvoid main(String[]args)

    {

        intlen=10;

        System.out.println(generateRandomPassword(len));

    }

}

코드 다운로드

Java에서 임의의 암호를 생성하는 것이 전부입니다.