암호화
Ormar는 데이터베이스의 필드만 암호화하는 방법을 제공합니다. 제공된 암호화 백엔드는 단방향 암호화(HASH 백엔드)와 양방향 암호화/암호 해독(FERNET 백엔드)을 허용합니다.
!!!경고, 암호화가 작동하려면 선택적 암호화 패키지를 설치해야 합니다.
| `pip install cryptography` 또는 `pip install ormar[crypto]` 의 ormar로 수동으로 할 수 있습니다.
|
!!! 경고: pt_backend를 추가하면 데이터베이스 열 유형이 TEXT로 변경되며, 마이그레이션(alembic) 또는 수동 변경을 통해 db에 반영되어야 합니다.
필드 암호화 정의
필드를 암호화하려면 적어도 암호화 _ 비밀 및 암호화 _ 백엔드 매개 변수를 전달해야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12 | base_ormar_config = ormar. OrmarConfig (
메타데이터 = 메타데이터
데이터베이스 = 데이터베이스
)
클래스 필터(ormar. 모델):
ormar_config = base_ormar_config 사본()
ID: int = ormar. 정수(prial_key = 참)
이름: str = ormar. 문자열(max_long = 100,
pt_="secret123",
pt_backend=ormar. EncryptBackends. FERNET)
|
!!!는 기본 _key 열과 관계형 시리즈(ForeignKey 및 ManyToLong)를 제외한 모든 필드 유형을 암호화할 수 있다고 경고합니다. 자세한 내용은 백엔드 세부 정보를 확인하십시오.
사용 가능한 백엔드
해시
HASH는 검색 시 암호가 해독되지 않는 단방향 해시(암호와 같은)입니다.
설정하려면 적절한 백엔드 값을 전달합니다.
| ... # 나머지 모델 정의
암호: str = ormar. 문자열(max_long = 128,
pt_="secret123",
pt_backend=ormar. EncryptBackends. HASH)
|
이 백엔드는 저장된 값의 암호를 해독하지 않으므로 문자열 필드에만 적용됩니다. 사용된 해시는 sha512 해시이므로 필드 길이는 = 128이어야 합니다.
경고: HASH 백엔드에서 전체 값으로 필터링할 수 있지만 암호화된 값을 비교하기 때문에 포함과 같은 필터가 작동하지 않습니다.
!!!제공된 암호화 \ _ 비밀은 먼저 스스로를 해시하고 소금으로 사용하므로 저장된 문자열과 비교하려면 이 단계를 다시 만들어야합니다. 암호화된 문자열을 비교하면 안정적으로 정렬할 수 없기 때문에 주문 \ _ by가 작동하지 않습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 | 클래스 해시(ormar. 모델):
ormar_config = base_ormar_config (테이블 이름 = "해시")
ID: int = ormar. 정수(prial_key = 참)
이름: str = ormar. 문자열(max_long = 128,
pt_="udxc32",
pt_backend=ormar. EncryptBackends. HASH)
기다리다 해시 (이름 = 'test1').저장 ()
# 저장된 값을 다시 만드는 단계를 기록합니다.
# hashlib 대신 암호화 패키지를 사용할 수도 있습니다.
비밀 = hashlib.sha256 ("udxc32" .encode ()) .다이제스트 ()
비밀 = base64.urlsafe_b64encode (비밀)
hash_test1 = hashlib.sha512 (비밀 + 'test1'.encode ()) .hexdi ()
# 전체 가치 비교 작동
Hash1 = 기다립니다 Hash.ts.get (이름 = 'test1')
주장hash1.name== hash_test1
# 그러나 부분 비교는 그렇지 않습니다 (해시 문자열 비교)
pytest.로 (NoMatch):
Filter.ts.get을 기다립니다(name __ = '테스트')
|
페네트
FERNET은 양방향 암호화/암호 해독 백엔드입니다.
설정하려면 적절한 백엔드 값을 전달합니다.
| ... # 나머지 모델 정의
연도: int=ormar. 정수(pt_="secret123",
pt_backend=ormar. EncryptBackends. FERNET)
|
이 값은 데이터베이스로 이동하는 동안 암호화되고 나가는 길에 암호가 해독됩니다. 반환 값이 해당 파이썬 유형으로 구문 분석되므로 모든 유형에 사용할 수 있습니다.
!!! 경고 FERNET 백엔드에서는 암호화된 값의 일부가 타임스탬프이기 때문에 필터링 가능성이 완전히 손실됩니다. 암호화된 문자열을 비교하기 때문에 안정적으로 정렬할 수 없기 때문에 순서 _by도 마찬가지입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | 클래스 필터(ormar. 모델):
ormar_config = base_ormar_config 사본()
ID: int = ormar. 정수(prial_key = 참)
이름: str = ormar. 문자열(max_long = 100,
pt_="asd123",
pt_backend=ormar. EncryptBackends. FERNET)
필터 대기(이름 = 'test1').저장()
필터 대기(이름 = 'test1').저장()
# 값이 올바르게 암호화되고 나중에 암호 해독됩니다.
필터 = 기다리다 필터.ts.all ()
필터[0]를 주장합니다. 이름 == 필터 [1]. 이름 == '테스트 1'
# 그러나 fernet 해시의 일부가 타임스탬프이기 때문에 전혀 필터링할 수 없습니다.
# 즉, 동일한 문자열을 2번 암호화하여도 다릅니다.
pytest.로 (NoMatch):
Filter.ts.get을 기다립니다(이름 = 'test1')
|
사용자 지정 백엔드
다른 유형의 암호화(예: AES)를 지원하려면 자체 암호화 백엔드를 제공할 수 있습니다.
백엔드를 설정하려면 ormar.field를 하위 클래스로 설정하기만 하면 됩니다. EncryptBackend 클래스 및 필요한 백엔드를 제공합니다.
가상 백엔드(아무것도 하지 않음)의 예는 다음과 같을 수 있습니다.
| 클래스 DummyBackend(ormar.field). EncryptBackend):
데프 _ 초기화 _ 백엔드 (자체, _key: 바이트) -> 없음:
통과
암호화 방어(자체, 값: 임의) -> str:
반환 값
암호 해독(자체, 값: 임의) -> str:
반환 값
|
이 백엔드를 사용하려면 pt_backend를 CUSTOM으로 설정하고 pt_ _backend를 통해 백엔드를 매개 변수로 제공하십시오.
| 클래스 필터(ormar. 모델):
ormar_config = base_ormar_config 사본()
ID: int = ormar. 정수(prial_key = 참)
이름: str = ormar. 문자열(max_long = 100,
pt_="secret123",
pt_backend = ormar. EncryptBackends. 커스텀,
pt_t_backend=DummyBackend
)
|