高级安全擦除算法(ASDA)
下一代安全数据擦除方案。

ASDA 以最小资源消耗实现高效、可验证的数据擦除。四个遍历以效率与透明度为核心设计:写后读(Read‑after‑Write)验证与擦除日志记录每一步。AES‑256与具备密码学强度的随机数显著提高取证恢复的难度。实现可无缝集成到既有流程。
ASDA 还超出NIST SP 800‑88 Rev.1(Clear / Purge / Destroy)的要求。根据介质(HDD/SSD/Flash),可视情况采用额外的 Purge机制,例如 Block Erase或 Cryptographic Erase。
四个擦除阶段概览
将数据区全部以 0xFF覆写,使原始内容不可识别。
将缓冲区中的原始内容以 AES‑256加密后写回,形成针对取证恢复的密码学屏障。(密钥仅暂存于 RAM,随后安全清除。)
写入预定义比特模式(如
10010010 01001001 00100100
),并进行写后读验证。偏差将再次覆写,并记录于擦除报告。 最后以密码学强度的随机数覆写(CSPRNG,符合 NIST SP 800‑90A)。
源代码文档:
DataShredder 类中的 ASDAErase 函数用于从文件中安全删除数据。该过程包括四个按顺序执行的步骤。
第一步是用特定模式覆写文件中的所有数据。这是通过 memset 函数实现的,它将一段内存设置为特定值。
第二步是使用 256 位 AES(高级加密标准)加密文件中的原始数据。这是通过 AES 类实现的,该类有一个 StartEncryption 方法,接受一个 unsigned char 数组作为输入。要加密的数据作为参数传递给此方法。
第三步是验证第二步中写入文件的数据。这是通过从文件中读回数据并使用 memcmp 函数与原始数据进行比较来完成的。如果读取的数据与原始数据不匹配,则返回状态值 0xC0000719L(STATUS_CONTEXT_MISMATCH)。
最后一步是用随机模式覆写文件中的数据。这是通过 DoRandomErase 函数实现的,该函数接受三个参数:要擦除的数据大小、用于存放数据的缓冲区以及表示迭代次数的字节值。
如果四个步骤全部成功完成,ASDAErase 函数将返回状态值 0。若任何一步失败,将返回相应的错误代码。
源代码:
long DataShredder::ASDAErase(DWORD size, byte *buf, byte iteration) { long status=0; LARGE_INTEGER nCurrentFilePointer = {0}; this->m_pLowLevelIO->GetFilePointer(&nCurrentFilePointer); // working buffer byte *buf1 = (byte*)malloc(size); // read file content if(iteration == 0) { status=this->m_pLowLevelIO->Read(buf1, size, NULL); this->m_pLowLevelIO->SetFilePointer(&nCurrentFilePointer); } // wipe with 0xFF if(status == 0) { memset(buf, 0xFF, size); status=this->m_pLowLevelIO->Write(buf, size, NULL); if(!m_noBuffering) this->m_pLowLevelIO->Flush(); this->m_pLowLevelIO->SetFilePointer(&nCurrentFilePointer); } // encrypt original file content if(status == 0) { ULONG K[8]; ULONG seed; seed=GetTickCount(); K[0]=LowLevel::IO::Random(&seed); K[1]=LowLevel::IO::Random(&seed); K[2]=LowLevel::IO::Random(&seed); K[3]=LowLevel::IO::Random(&seed); K[4]=LowLevel::IO::Random(&seed); K[5]=LowLevel::IO::Random(&seed); K[6]=LowLevel::IO::Random(&seed); K[7]=LowLevel::IO::Random(&seed); AES aes; aes.SetParameters(256); aes.StartEncryption((const unsigned char *)K); for(ULONG i=0; (i*4)m_pLowLevelIO->Write(buf, size, NULL); if(!m_noBuffering) this->m_pLowLevelIO->Flush(); this->m_pLowLevelIO->SetFilePointer(&nCurrentFilePointer); } if(status == 0) { byte bData[] = { 0x92,//10010010, 0x49,//01001001, 0x24 //00100100 }; for(DWORD i = 0; i < size; i++) { buf[i] = bData[i%3]; } status=this->m_pLowLevelIO->Write(buf, size, NULL); if(!m_noBuffering) this->m_pLowLevelIO->Flush(); this->m_pLowLevelIO->SetFilePointer(&nCurrentFilePointer); // verify if(0==this->m_pLowLevelIO->Read(buf1, size, NULL)) { this->m_pLowLevelIO->SetFilePointer(&nCurrentFilePointer); if(memcmp(buf1, buf, size)) { status=0xC0000719L;//STATUS_CONTEXT_MISMATCH; } } else { status=0xC0000719L;//STATUS_CONTEXT_MISMATCH; } } if(status == 0) { status = this->DoRandomErase(size, buf, 0); } free(buf1); return status; }
源代码说明:
该源代码定义了一个名为 ASDAErase 的函数,它接收三个参数:整数 size、指向字节数组的指针 buf,以及整数 iteration。函数返回一个整数状态值。
函数开始时声明并初始化一些变量。然后,它通过 LowLevelIO 类对象的 GetFilePointer 函数读取当前文件指针位置。接着分配内存 buf1,并使用 Read 函数将文件内容读取到该缓冲区。
函数随后通过 LowLevelIO 对象的 Write 函数将值 0xFF 写入文件来擦除数据,然后使用 AES 算法加密原始文件内容。它会生成随机密钥并设置 AES 加密参数,然后使用 StartEncryption 函数以 4 字节块的方式加密文件内容。
函数接着将加密后的数据写回文件,并按顺序覆写 0x92、0x49、0x24 模式。之后,通过 Read 函数和 memcmp 函数将工作缓冲区 buf1 中的数据与模式数据 buf 进行比较,以验证数据是否正确写入。
如果上述操作均成功,函数将调用 DoRandomErase 函数用随机数据覆写文件。最后,函数释放 buf1 所分配的内存并返回状态值。