데이터베이스 기능을 사용하여 사용자를 인증하는 더 빠른 방법이 있습니까? crypt() 함수는 많은 시간이 걸렸습니다.데이터베이스 기능을 사용하여 사용자 인증을보다 신속하게 수행
테이블 :
id (bigserial) pkey
username (text) indexed
password (text) indexed [password is the hash: crypt('12345678', gen_salt('bf', 8))]
일반 시험 :
test_db=# explain analyze SELECT id FROM users WHERE id = 1 AND password='12345678' LIMIT 1;
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.28..8.29 rows=1 width=8) (actual time=0.029..0.029 rows=0 loops=1)
-> Index Scan using users_idx_password01 on users (cost=0.28..8.29 rows=1 width=8) (actual time=0.028..0.028 rows=0 loops=1)
Index Cond: (password = '12345678'::text)
Filter: (id = 1)
Total runtime: 0.037 ms
(5 rows)
크립트() 테스트 :
test_db=# explain analyze SELECT id FROM users WHERE id = 1 AND password=(crypt('12345678',password)) LIMIT 1;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.28..8.30 rows=1 width=8) (actual time=7.534..7.534 rows=1 loops=1)
-> Index Scan using users_pkey on users (cost=0.28..8.30 rows=1 width=8) (actual time=7.534..7.534 rows=1 loops=1)
Index Cond: (id = 1)
Filter: (password = crypt('12345678'::text, password))
Total runtime: 7.550 ms
(5 rows)
설계 기준에 따라 아니요. 느려짐은 기능이 아니라 버그입니다. http://stackoverflow.com/a/6364778/239394를 참조하십시오. 게다가 쿼리 당 수 밀리 초의 차이에 대해 이야기하고 있습니다. 한 사용자는 반드시 알 필요가 없습니다. 예, 로그인 시도 횟수가 많은 시스템에 추가 될 수 있습니다 (예 : 서비스 거부 공격에 영향을 줄 수 있음). 그러나 해시 속도를 높이는 것은 문제를 해결하는 방법이 아닙니다. – Andrew
감사합니다 Andrew, 문제를 올바르게 해결합니다. 모든 요청을 인증 받아야하고 서버가 응답하지 않는 보통 동시성 (200 req/초)으로되어 있어야합니다. 그 시점에서 하드웨어 업그레이드와 분할을 고려 중입니다. 감사. – DPZ