리눅스에서 강력한 암호를 만드는 방법?


24

Linux에서 일반 사용자와 관리자 모두를 위해 강력한 암호를 만드는 방법과 특정 프로그램이 있는지 궁금합니다.

답변:



16

개인적으로, 생성 된 암호는 기억하기 매우 어렵 기 때문에 암호 생성기를 사용하지 않는 것이 좋습니다. 그러나 한 가지 휴대용 솔루션은 / dev / urandom 을 사용하는 것입니다

특수 문자를 포함하지 않는 임의의 비밀번호를 작성하는 길이는 10 자입니다.

$ cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 10` 
dyxJRKldvp

이것은 / dev / urandom에서 바이트를 가져 tr와서 명령에 지정된 패턴에 맞지 않는 바이트를 삭제하고을 사용 하여 10 자로 제한합니다 head.

특수 문자를 포함하는 임의의 비밀번호를 작성하는 길이는 10 자입니다.

$ cat /dev/urandom | tr -dc 'a-zA-Z0-9-_!@#$%^&*()_+{}|:<>?=' | fold -w 10 | grep -i '[!@#$%^&*()_+{}|:<>?=]' | head -n 1
MSF4wj@vP0

이것은 tr불필요한 바이트를 제거한 후에 약간 다른 기술을 사용 합니다. 아이디어는 적어도 하나의 특수 문자를 갖도록 강요하기 때문입니다. 이것은 fold명령을 사용하여 행을 10 개의 그룹으로 랩핑 한 다음 grep특수 문자를 포함하는 행만 페치 하는 데 사용 됩니다. head그런 다음 요구 사항을 충족하는 첫 번째 비밀번호를 가져옵니다.


1
당신은 또한 사용할 수 있습니다 [:print:]에 대한 tr( tr -dc '[:print:]'당신은 약간의 편집증 경우). 그러면 키보드에서 사용할 수있는 기호가 문제가됩니다.
lgeorget

11

나는 몇 년 전에이 작은 스크립트를 작성했으며 그 이후로 사용 해 왔습니다. 어쨌든, 그것은 printf불행히도 스크립트에서 거의 볼 수 없는 재미있는 BASH의 남용 과 흥미로운 기능을 사용합니다 typeset.

#!/usr/bin/env bash
# Released into public domain
# Aaron Bockover, 2005
# http://abock.org

typeset -i length; length=$1
typeset -i rounds; rounds=$2
[ $rounds -lt 1 ] && rounds=1
[ $length -lt 1 ] && {
    echo "Usage: $0 <length> [<rounds>]" 2>/dev/null; exit 1;
}
for ((i=0; i < $rounds; i++)); do
    for ((j=0; j < $length; j++)); do
        set=$(($RANDOM % 20))
        if   [ $set -le 6 ];  then o=65; l=26; # 35% uppercase
        elif [ $set -le 13 ]; then o=97; l=26; # 35% lowercase
        elif [ $set -le 17 ]; then o=48; l=10; # 20% numeric
        elif [ $set -le 18 ]; then o=58; l=7;  # 10% symbolic
        elif [ $set -le 19 ]; then o=33; l=15; fi
        ord=$(($o + $RANDOM % $l))
        printf \\$(($ord / 64 * 100 + $ord % 64 / 8 * 10 + $ord % 8))
    done
    echo
done

스크립트 Aaron에 대한 감사합니다 !!!
Gasuma

4

또한 KeePassX 를 추가 하여 시스템 엔트로피를 사용하여 GUI를 사용하여 몇 가지 멋진 기능으로 강력한 암호를 생성하는 옵션을 제공합니다. 또한 암호를 관리하고 암호화 된 파일로 저장하는 옵션도 제공합니다.

KPX 비밀번호 생성기 인터페이스는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


3

apg 쉽게 기억할 수있는 암호를 원한다면 나쁜 선택이 아닙니다.

; apg -m 16 -a 0 -t
ByajNudgolIston9 (Byaj-Nud-gol-Ist-on-NINE)
Af}ockhuecUjrak8 (Af-RIGHT_BRACE-ock-huec-Uj-rak-EIGHT)
IakijKadmomIvgig (Iak-ij-Kad-mom-Iv-gig)
NutIlOsyahodBeef (Nut-Il-Os-ya-hod-Beef)
anMechOybekazell (an-Mech-Oyb-ek-az-ell)
VumushCummAd{fra (Vum-ush-Cumm-Ad-LEFT_BRACE-fra)

에 따른 참고 암호는 긴 적어도 12 자이어야합니다.


2

나는 무작위가 아닌 것을 사용하지만 모든 공격 목적 (마스터 비밀번호, 마지막 패스 는 다른 비밀번호를 생성 하기에 충분)으로 다양 합니다. 마스터 비밀번호를 생성하는 방법은 다음과 같습니다.

echo -n "some seed" |  openssl dgst -binary -sha1 | base64 | sed -e 's/.\{4\}/& /g'

그리고 출력

H1sI Wpbj JE2P CdVJ A1qb 9B/e u7M= 

이제 몇 개의 섹션을 선택하고 비밀번호를 만들고, 재정렬하고, 일부를 제외하고, 문자를 추가하거나 2를 무작위로 사용하십시오. 시드를 기억할 수있는 한 시드를 재생성하고 비밀번호를 복구 할 수 있습니다 (너무 많은 수정을하지 않는 한)


1

pwgen 복잡성을 설정하기 위해 여러 매개 변수를 지정하고, 생성 할 문자 클래스 수, 길이 등의 문자 매개 변수를 지정할 수있는 멋진 cli 도구입니다.


1

다음은 XKCD 스타일 비밀번호 문구 를 생성하기위한 일회용 스크립트입니다 . /usr/share/dict/words대부분의 단어가 길지만 쉽게 구할 수 있기 때문에이 사전에 적합하지 않습니다. 더 좋은 암호를 위해 S / Key 일회용 암호 단어 목록 과 같은 짧은 단어 사전을 사용할 수 있습니다 .

dict="/usr/share/dict/words"
max="`wc -l <"$dict"`" \
    perl -e '$count=4;
        $/=\4; while (<>) {
            print unpack('L') % $ENV{max} + 1, qq(\n); last unless --$count
        }' /dev/urandom | 
    while read n ; do 
        tail -n "+$n" "$dict" | head -1
    done

0

그놈 사용자이고 다양한 계정의 비밀번호를 저장해야하는 경우 계시 비밀번호 관리자를 사용해 볼 수 있습니다 . 비밀번호 길이 만 설정하고 문자와 숫자 외에 문장 부호 문자를 포함할지 여부를 선택한다는 기본 비밀번호 생성기 기능이 있습니다.


0

내가 틀렸다면 나를 바로 잡으십시오.하지만 내가 이해하는 한 컴퓨터가 완전히 임의의 문자열을 만들 수있는 방법 은 없습니다 . 그래서 나는 다음과 같은 아이디어를 생각해 냈습니다 [그리고 그것이 완전히 어리석지 않기를 바랍니다] :

26면 주사위를 던지면 던질 확률은 26이라고 1:26입니다. 다시 말해 26을 던질 확률은 약 0.04 %입니다. 또한 주사위에는 메모리와 버그가 없습니다. 나는 다음 아이디어를 생각해 냈습니다.

  • 26면 주사위를 받으십시오. 각면은 알파벳 글자와 일치합니다.
  • 각면이 0에서 9 사이의 숫자와 일치하는 열면 체 주사위를 얻으십시오.
  • 동전을 뒤집다
  • 머리 의미 : 편지 주사위를 던져
  • 꼬리 의미 : 숫자 주사위를 던져

인쇄 할 용지 모델 :

참고 : 저는 Math Pro가 아니며 2600 잡지의 기사를 읽은 후이 아이디어를 생각해 냈습니다. 방금 기본 개념에 대한 아이디어를 추가했습니다.

또한 : 이것이 ' 첫 번째 무차별 암호 크래커 작성 '에 대한 완벽한 예가 아닌지 궁금합니다 . 그러나 당신의 질문은 토론을위한이 아이디어를 제시 할 완벽한 이유를 제공했습니다.


1
실제로 완전히 임의의 비트를 생성하는 방법이 있습니다. 예를 들어 HDD의 전자기 노이즈를 사용하거나 IO 속도의 변화 ... '의사 난수 발생기'라고하는 발생기에서 원하는 것은 출력하는 시퀀스가 ​​실행되는 알고리즘에 의해 실제 무작위 시퀀스와 구별 될 수 없다는 것입니다. 다항식 시간.
lgeorget

1
Diceware 시스템에 관심이있을 수 있습니다. 비슷한 아이디어를 따르지만 6 면체 주사위 만 사용합니다. world.std.com/~reinhold/diceware.html
Jander

0

강력한 암호를 만들기 위해 .zshrc.local 파일에 두 개의 별칭이 추가되었습니다.

첫 번째는 :

alias pw.graph="cat /dev/urandom | tr -dc '[:graph:]' | fold -w 1000 | perl -pe 's/(.)(?=.*?\1)//g' | head -n 5"

pw.graph 입력 결과는 스페이스 바를 제외하고 키보드로 입력 할 수있는 모든 문자의 5 행입니다.

/d=|&mRq!g$QaNZ'L;CfEli,D3\)*h-jkerzv?{y"_Ic(0BtxJwF59:@G}KV1X2o>S~[#]s+W%A.<6bpTO^uP7U4HMYn`8
RIdW87{a4O3][?&rTn=m/:Y`_u*hqy2c%s@!ZPM$5to1f-.U9ClK,)'jDi0"pw>EzN^|gX~BSAJk\VFG(H<bx}+Q6#vL;e
s^H@yEo/X$|d?_jw7-n'l>m"Cb\W5.tTe0APB1D!#69[p+(8x}F&~RM`q3Q%vhfOiUZz]ucJk:)*agGV;=NY4{,K2SLrI<
$/t|!s}og5u:X~hcJUyYHf>;l<zDedL`.T*K8]CBSW[(xw+Mm^E3r16b-97%'@jVR{ZG#0p4AP=,I?\n&"a)vqNkQ2iO_F
,7n|^Y\%MpeBqvhI3mE<9zPS/~+sU`4ZoCWl&uxd'ft"kjcOy0X!{a-T_6RKiVg5Hb21D)w>@*N8;A[(rLG=$Q:.#]FJ?}

두 번째는 :

alias pw.alnum="cat /dev/urandom | tr -dc '[:alnum:]' | fold -w 1000 | perl -pe 's/(.)(?=.*?\1)//g' | head -n 5"

pw.alnum을 입력하면 출력 가능한 모든 문자와 숫자가 모두 대문자와 소문자입니다.

E6wgCfVBbXjyzYQ8USKl79LqPih0e5mvGrNHd3osaW2OxkJ1RM4nFTtcuZIpDA
GTvQON1dsZSpJmegBMK6bqnEciU7k0AoV2H4Wh53zr9YRfLlDxywXItu8CjPFa
6u1Db9MfyBApZdU7gqoV2PGwH5LcxWi3JNj8nkQCIThezSlYEXsOtrmF04KvaR
VFrsGwI9yAmabEnlRTKgZO23vUq4f6LHkzQP7tMjNW8ph1exuDoBCXSd50JciY
G3r6Em5tlfjQARJx9gWHes7bCVwkzcP48KaSIXyUFBMLqT0op1uDNdih2nYZOv

나는 일반적으로 pw.graph를 사용하고 라인의 임의의 부분을 복사합니다. 일부 암호는 기호를 허용하지 않으므로 pw.alnum의 일부를 사용합니다.


0

저장된 .html 파일로 사용합니다.

<script>
var keylist="abcdefghijklmnopqrstuvwxyzABCEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*_"
var temp=''

function generatepass(plength){
temp=''
for (i=0;i<plength;i++)
temp+=keylist.charAt(Math.floor(Math.random()*keylist.length))
return temp
}

function populateform(enterlength){
document.pgenerate.output.value=generatepass(enterlength)
}
</script>

<form name="pgenerate">
<input type="text" size=32 name="output">
<input type="button" value="Generate Password" onClick="populateform(this.form.thelength.value)"><br />
<b>Password Length:</b> <input type="text" name="thelength" size=3 value="32">
</form>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.