문제

MySQL에서 비밀번호 재설정을 위해 암호화된 보안 문자열을 생성하려고 합니다.나는 PHP의 애플리케이션 수준에서 이 작업을 수행할 수 있다는 것을 알고 있습니다.하지만 그러기 위해서는 많은 고객이 갖고 있지 않은 OpenSSL 확장이 필요합니다.

널리 사용 가능한 안전한 방식으로 MySQL 5에서 이를 수행할 수 있다면 그것은 이상적일 것입니다.이것이 가능한가?

메모:비밀번호 재설정을 위한 보안 토큰을 생성하기 위한 것입니다.보안 연결과는 아무런 관련이 없으므로 https를 사용하는 것은 해결책이 아닙니다.

도움이 되었습니까?

해결책

많이있다 암호화 mySQL에서 사용할 수 있는 메소드

양방향 암호화가 필요한 경우 사용할 수 있습니다 aes_encrypt 동반되는 aes_decrypt

보안 해시만 필요한 경우 다음을 사용할 수 있습니다. sha2

다음 명령문은 다음과 유사한 결과를 얻을 수 있습니다. openssl_random_pseudo_bytes

SELECT HEX(SHA2(CONCAT(NOW(), RAND(), UUID()), 512));

위의 진술은 NOW() 그리고 그것을 연결합니다 RAND() 그리고 UUID(), 그런 다음 512비트를 수행합니다. SHA2() 결과를 암호화한 다음 이를 다음으로 변환합니다. HEX()

다른 팁

이것은 MySQL의 난수 생성기입니다.

double my_rnd(struct rand_struct *rand_st)
{
    rand_st->seed1= (rand_st->seed1*3+rand_st->seed2) % rand_st->max_value;
    rand_st->seed2= (rand_st->seed1+rand_st->seed2+33) % rand_st->max_value;
    return (((double) rand_st->seed1) / rand_st->max_value_dbl);
}
.

외부에서 큰 무작위 값을 전달해야합니다.고유 한 보장 된 512 비트 난수가 필요하다고 말합니다.이것은 충분할 수 있습니다 :

sha2(concat(now(),rand(),gibberish512,id),512)
.

Gibberish512가 많은 값에서 rand를 호출하는 저장 프로 시저에 대한 arg이며, 시간 소인은 그 밖에 없었을 때 시간이 멀어지고 있습니다.MySQL rand ()는 자체적으로 64 개 미만의 엔트로피가 있습니다.무작위 입력, 주사위 롤 또는 적절한 암호화 도구 PRNG에서 생성 된 외부에서 임의의 인수를 전달합니다.

BEGIN

declare r tinytext;
declare s tinytext default '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
declare n int;

set r='';

while length(r)<=16 do
    set n=rand() * 61;
    set r=concat(r,substr(s,n,1));
end while;

select r;

END
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 dba.stackexchange
scroll top