PHP를 사용하여 암호를 암호화하고 해독하는 가장 좋은 방법?
사용자들의 해외 계정 정보를 웹사이트에 저장하거나 사용자 이름과 비밀번호를 rapidshare로 부릅니다.정보를 안전하게 유지하고 싶지만, 정보를 해시하면 나중에 사용하기 위해 가져올 수 없다는 것을 알고 있습니다.
Base64는 복호화가 가능하기 때문에 플레인오프만 사용해도 의미가 없습니다.내 생각은 사용자를 스크램블하여 base64가 되기 전후에 패스하는 것입니다.복호화 후에도 재미있는 텍스트가 표시됩니다.문자열의 고유한 스크램블을 만들고 나중에 값이 재계산되면 스크램블을 해제하는 php 함수가 있습니까?
좋은 의견이라도 있나?
패스워드는 암호화하지 말고 bcrypt와 같은 알고리즘을 사용하여 해시해야 합니다. 이 답변에서는 PHP에서 비밀번호 해시를 적절하게 구현하는 방법을 설명합니다.단, 암호화/복호화 방법은 다음과 같습니다.
$key = 'password to (en/de)crypt';
$string = ' string to be encrypted '; // note the spaces
암호화 방법:
$iv = mcrypt_create_iv(
mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
MCRYPT_DEV_URANDOM
);
$encrypted = base64_encode(
$iv .
mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
hash('sha256', $key, true),
$string,
MCRYPT_MODE_CBC,
$iv
)
);
복호화 방법:
$data = base64_decode($encrypted);
$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));
$decrypted = rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
hash('sha256', $key, true),
substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
MCRYPT_MODE_CBC,
$iv
),
"\0"
);
경고:위의 예에서는 정보를 암호화하지만 조작을 방지하기 위해 암호문을 인증하지는 않습니다.특히 제공된 코드는 Oracle 공격에 취약하므로 인증되지 않은 암호화에 의존해서는 안 됩니다.
다음 항목도 참조하십시오.
- https://stackoverflow.com/a/30189841/2224584
- https://stackoverflow.com/a/30166085/2224584
- https://stackoverflow.com/a/30159120/2224584
또한 암호화 키에 "비밀번호"만 사용하지 마십시오.암호화 키는 랜덤 문자열입니다.
echo 'Encrypted:' . "\n";
var_dump($encrypted); // "m1DSXVlAKJnLm7k3WrVd51omGL/05JJrPluBonO9W+9ohkNuw8rWdJW6NeLNc688="
echo "\n";
echo 'Decrypted:' . "\n";
var_dump($decrypted); // " string to be encrypted "
보안 경고:이 클래스는 안전하지 않습니다.Rijndael256-ECB를 사용하고 있어 의미론적으로 안전하지 않아"작동한다"고 해서 "안전하다"는 의미는 아닙니다.또한 적절한 패딩을 사용하지 않기 때문에 나중에 후행 공간을 제거합니다.
최근에 이 수업을 발견했는데, 꿈만 같아!
class Encryption {
var $skey = "yourSecretKey"; // you can change it
public function safe_b64encode($string) {
$data = base64_encode($string);
$data = str_replace(array('+','/','='),array('-','_',''),$data);
return $data;
}
public function safe_b64decode($string) {
$data = str_replace(array('-','_'),array('+','/'),$string);
$mod4 = strlen($data) % 4;
if ($mod4) {
$data .= substr('====', $mod4);
}
return base64_decode($data);
}
public function encode($value){
if(!$value){return false;}
$text = $value;
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->skey, $text, MCRYPT_MODE_ECB, $iv);
return trim($this->safe_b64encode($crypttext));
}
public function decode($value){
if(!$value){return false;}
$crypttext = $this->safe_b64decode($value);
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->skey, $crypttext, MCRYPT_MODE_ECB, $iv);
return trim($decrypttext);
}
}
그리고 그걸 뭐라고 부르면:
$str = "My secret String";
$converter = new Encryption;
$encoded = $converter->encode($str );
$decoded = $converter->decode($encoded);
echo "$encoded<p>$decoded";
보안 경고:이 코드는 안전하지 않습니다.
작업 예
define('SALT', 'whateveryouwant');
function encrypt($text)
{
return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))));
}
function decrypt($text)
{
return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
}
$encryptedmessage = encrypt("your message");
echo decrypt($encryptedmessage);
암호화를 다룰 때 주의해야 할 것은 다음과 같습니다.
똑똑해지려고 노력하고 자신만의 것을 발명하는 것은 보통 당신에게 뭔가 불안한 것을 남길 것이다.
PHP와 함께 제공되는 암호화 확장 기능 중 하나를 사용하는 것이 가장 좋습니다.
보안 경고:이 코드는 안전하지 않습니다.선택된 암호문 공격에 취약할 뿐만 아니라 이 암호문은
unserialize()
PHP를 사용하다
문자열/배열을 처리하려면 다음 두 가지 기능을 사용합니다.
function encryptStringArray ($stringArray, $key = "Your secret salt thingie") {
$s = strtr(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), serialize($stringArray), MCRYPT_MODE_CBC, md5(md5($key)))), '+/=', '-_,');
return $s;
}
function decryptStringArray ($stringArray, $key = "Your secret salt thingie") {
$s = unserialize(rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode(strtr($stringArray, '-_,', '+/=')), MCRYPT_MODE_CBC, md5(md5($key))), "\0"));
return $s;
}
문자열/어레이는 암호화 전에 시리얼화되므로 URL을 통해 문자열 또는 어레이를 저장/전송할 수 있습니다.
이렇게 하면 최소한의 보호만 받을 수 있습니다.공격자가 응용 프로그램에서 임의 코드를 실행할 수 있는 경우 응용 프로그램과 동일한 방법으로 암호를 얻을 수 있습니다.파일에 개인 키를 저장하고 이를 사용하여 DB로 이동하는 동안 암호화하고 나가는 동안 암호를 해독하면 일부 SQL 주입 공격 및 잘못된 DB 백업으로부터 보호할 수 있습니다.그러나 SQL 주입 문제를 완전히 방지하려면 bindparams를 사용해야 합니다.
암호화를 결정할 경우 이를 위해 고급 암호 라이브러리를 사용해야 합니다. 그렇지 않으면 잘못될 수 있습니다.키 셋업, 메시지 패딩 및 무결성 검사를 올바르게 받아야 합니다.그렇지 않으면 암호화 작업은 거의 소용이 없습니다.GPME는 하나의 예로서 좋은 선택입니다.Mcrypt는 너무 낮은 레벨이고 당신은 아마 틀릴 것이다.
mycrypt()를 확인해 주세요.http://us.php.net/manual/en/book.mcrypt.php
postgres를 사용하는 경우 데이터베이스 수준의 암호화를 위한 pgcrypto가 있습니다.(검색과 정렬이 용이해집니다)
할 수 의 데이터를 암호화/은, 패스워드 「」, 「」, 「」, 「」, 「」, 「」, 「」, 「」/「」, 「」, 「」, 2)를 입니다.user-pass
및 의 경우 「」 「」 「」 「」).system-pass
를 참조해 주세요.
시나리오
user-pass
는 데이터베이스에 md5와 함께 저장되며 각 사용자의 시스템 로그인을 검증하기 위해 사용됩니다.이 사용자 패스는 사용자마다 다릅니다.- 의 각 에 "md5"가.
system-pass
데이터 암호화/암호화에 사용됩니다.이 시스템 패스는 각 사용자에 대해 동일합니다. - 사용자가 시스템에서 삭제될 때마다 보안 문제를 피하기 위해 이전 시스템 경로로 암호화된 모든 데이터를 새 시스템 경로로 다시 암호화해야 합니다.
언급URL : https://stackoverflow.com/questions/1289061/best-way-to-use-php-to-encrypt-and-decrypt-passwords
'programing' 카테고리의 다른 글
PHP DOMhtml5 태그 오류/경고 (0) | 2022.11.07 |
---|---|
JavaScript 객체의 컨스트럭터 (0) | 2022.11.07 |
MySQL의 FOR UPDATE 잠금을 사용할 때 정확히 잠긴 것은 무엇입니까? (0) | 2022.11.07 |
자바 수식어의 적절한 순서(추상, 최종, 공개, 정적 등)는 무엇입니까? (0) | 2022.11.07 |
RESTful API 구축 방법 (0) | 2022.11.07 |