모든 이야기

NAND에 무작위처럼 보이는 데이터를 저장하는 실용적인 이유

같은 파일을 저장해도 NAND 셀에 들어가는 bit열은 원본과 다를 수 있다. 암호화 때문만은 아니다. NAND Data Randomization은 사용자가 만든 반복 패턴을 그대로 셀에 배치하지 않으려는 신뢰성 기법이다. 원본을 나중에 정확히 돌려받을 수 있으면서도, 물리 저장 패턴은 무작위처럼 보이게 만든다.

배경에는 셀 오류가 저장 상태와 이웃 상태에 의존한다는 문제가 있다. 반복적인 데이터가 반복적인 셀 상태를 만들면 특정 조합이 넓은 영역에 나타날 수 있다. randomization은 이런 사용자 패턴과 물리적인 배치 사이의 직접적인 관계를 약하게 만든다.

데이터를 숨기기보다 패턴 의존성을 줄인다

NAND 신뢰성 원문의 Data Scrambling 절은 저장 값에 따라 달라지는 오류를 완화하기 위해 컨트롤러가 기록 전에 데이터를 섞는다고 설명한다. 0과 1이 무작위로 분산되도록 만드는 것이 목적이며, 읽을 때 되돌릴 수 있는 과정이다. 대표적인 설명은 LFSR로 의사 난수열을 만들고 데이터와 XOR하는 방식이다. Cai 등의 원문 §1.3.6

XOR는 같은 mask를 두 번 적용하면 원래 값이 된다. 원본 D, mask M에 대해 저장 값 S=D XOR M이고, 읽은 값에 M을 다시 XOR하면 D다. 데이터 길이가 같고, 처음과 같은 mask를 정확하게 재현한다는 조건이 붙는다.

가상의 16bit 데이터가 0000 0000 0000 0000이라고 하자. mask를 1011 0010 0110 1001로 정하면 저장 값은 mask와 같다. 원본에서는 인접한 두 bit가 모두 같은 곳이 15개다. mask의 15개 인접 경계에서는 같은 쌍이 5개다. 긴 0 반복을 그대로 남겨 두지 않은 셈이다.

이 작은 예의 mask에는 0과 1이 각각 8개 있지만, 실제 모든 짧은 구간이 정확히 반반이라는 보장은 없다. 같은 bit 인접 쌍을 셌다고 실제 NAND의 오류율을 계산한 것도 아니다. 여러 bit를 저장하는 셀에서는 여러 page의 bit 조합과 state mapping이 실제 저장 상태를 정한다. 예는 반복 패턴이 바뀌는 모습만 보여 준다.

모든 입력에서 반복을 줄이는 함수는 아니다

의사 난수 mask를 사용해도 입력마다 원하는 변화가 보장되지는 않는다. 위 mask와 똑같은 값을 원본 D로 쓰면 D XOR M은 모두 0이 된다. reversible한 변환이므로 특정 출력 패턴을 만드는 입력은 언제든 존재한다.

randomization의 목적은 임의의 입력 하나를 골라도 물리 상태가 반드시 완벽하게 균등해진다는 보장이 아니다. 흔한 사용자 패턴이 그대로 넓은 반복 상태를 만드는 관계를 확률적으로 약하게 만드는 것이다. seed가 원본 데이터와 어떤 관계를 갖는지, 인접 page에서 mask가 어떻게 달라지는지도 효과에 영향을 준다.

pattern 의존성을 줄였다고 다른 오류가 사라지는 것도 아니다. 마모, retention, 읽기 조건과 셀 편차는 여전히 남는다. 섞은 뒤의 raw 오류율과 codeword별 정정 실패를 실제 조건에서 측정해야 효과를 판단할 수 있다. bit열이 시각적으로 복잡해 보인다는 이유만으로 신뢰성 개선을 증명할 수는 없다.

같은 mask를 되찾는 것이 복원의 조건이다

원문은 page의 논리 주소를 LFSR seed로 사용하는 예를 설명한다. garbage collection으로 물리 위치가 바뀌어도 논리 주소가 같다면 mask를 유지할 수 있다. 이 방식에서는 이동할 때 원본으로 풀었다가 다시 섞는 추가 작업을 피할 여지도 있다. 모든 컨트롤러가 논리 주소를 seed로 사용한다는 뜻은 아니다. 원문 §1.3.6의 seed와 page 이동 설명

물리 주소에 의존하는 별도 설계를 생각하면 이동 뒤 seed 처리도 달라진다. 원래 mask를 보존하거나 새 mask에 맞게 데이터를 바꾸는 정책이 필요하다. 주소만 바꾸고 읽기에서 다른 mask를 사용하면 원래 값이 돌아오지 않는다.

수식으로 보면 더 분명하다. 기록 mask가 M이고 복원 mask가 M′이면 결과는 D XOR M XOR M′다. 두 mask가 3개 위치에서 다르면, 저장 bit가 하나도 틀리지 않았더라도 복원한 데이터에는 그 3개 위치의 차이가 생긴다. 이는 가상 XOR 계산이며 실제 seed 오류가 늘 3bit 오류로 나타난다는 주장이 아니다.

randomization은 ECC를 대신하지 않는다. 저장 오류 E가 끼어든 S XOR E에 올바른 M을 적용해도 결과는 D XOR E다. mask가 오류를 알아내거나 지우는 정보는 제공하지 않는다. ECC와 scrambling의 처리 순서, seed와 관련 metadata의 보호는 구현의 데이터 경로에서 함께 설계해야 한다.

또한 공개된 mask나 예측 가능한 seed로 값을 섞는 것만으로 기밀성을 얻었다고 볼 수 없다. 원문도 scrambling과 AES 같은 별도 암호화 기법을 나누어 설명한다. 신뢰성을 위한 패턴 변환과 보안을 위한 암호화는 평가해야 하는 조건이 다르다.

NAND Data Randomization의 핵심은 원본을 잃지 않으면서 사용자 패턴과 셀 상태의 관계를 바꾸는 것이다. 좋은 평가는 패턴에 따른 오류가 얼마나 완화되었는지와, 이동·읽기 때 같은 mask를 얼마나 확실하게 복원하는지를 함께 묻는다. 저장 bit열이 무작위처럼 보이는 것은 시작이고, 유효한 원본으로 돌아오는 것이 끝이다.

NAND에 무작위처럼 보이는 데이터를 저장하는 실용적인 이유 · ariser