문제

그것은"지우기"문자열에 Delphi?게 설명하십시오:

나는 응용 프로그램을 작성하는 것을 포함한 DLL 을 사용자가 허.그것을 읽는 암호화로 파일을 XML DOM 정보를 사용하여,그 다음에 출시하실 수 있습니다.

그것은 명백하는 암호화되지 않은 XML 은 여전히 앉아의 메모리에 DLL,따라서 취약을 검사합니다.지금,나는 갈 바다에서 보호하이-사용자는 만들 수 있는 또 다른 DLL-그러나 내가 가지고 가고 싶은 기본적인 단계 방지에 사용자 이름에서 앉아있는 메모리에 있습니다.그러나 나는 생각하지 않는 쉽게 할 수 있습니 닦아의 메모리 어쨌든기 때문에 참조가 있습니다.경우 통과 내 DOM(는 TNativeXML 클래스)와 모든 문자열이 들고 그것을 만들 수 있으로 다음과 같은"녹색",그 다음 그것은하지 않습니다 실제로 할당하는 새로운 문자열이 포인터를 DOM 참조용이며,떠나 다음 이전 문자열에 앉아 거기에서 메모리를 기다리고 다시 할당?하는 방법이 있야 나는 죽이는 유일한 원본 및 사본?

또 거기에서 D2007 는 수단을 말한 그것은 닦아서 사용하지 않는 모든 메모리에서 힙?그래서 수를 놓은 DOM,다음을 말한 그것을 닦습니다.

또는 나 그냥 내 옆에 작업이 하지 않기 때문에 정말 가치가있을 귀찮게.

도움이 되었습니까?

해결책

나는 생각하지 않는다는 것은 가치가 있으로 괴롭히기 때문에,경우에는 사용자를 읽을 수 있는 메모리의 프로세스를 사용하여 DLL,동일한 사용자 수 있습도 중단에서 실행을 모니다.중단 실행하기 전에 메모리를 닦아 여전히 사용자 전체에 액세스할 수 있는 암호화되지 않은 데이터입니다.

IMO 모든 사용자가 충분히 흥미있고 할 수 있 당신은 무엇을 설명하지 않을 것이 심각하게 불편하여 DLL 을 닦는 메모리.

다른 팁

일반적으로 두 가지 점에 대해 이:

첫째,이것은 그 지역의 한개는"만약 당신에게 물어 봐야,당신은 아마 없을 것이다." 고 하지 마십시오는 잘못된 방법;나는 무례하는 귀하의 프로그래밍 능력입니다.그것은 단지는 안전하고,강력한 암호화 소프트웨어가거나 당신에 전문가 또는 당신은하지 않습니다.매우 같은 방법으로는 알고"약간의 karate"보다 훨씬 더 위험한 없음을 알고 가라테에서 모두.의 숫자가 있는 타사 도구를 쓰기 위해 보안 소프트웨어에서 델파이 있는 전문가의 지원을 제공하고 있습니다;나는 강력하게 장려하는 사람없이 깊은 지식을 암호화 서비스에서 윈도우,수학의 기초를 암호화하고 경험을 물리치 사이드 채널의 공격을 사용하여 그들을 대신하려고 시도"롤 자신 있습니다."

대답하의 특정 질문:Windows API 함수에 도움이되는 등 CryptProtectMemory.그러나,이것을 가져올 것이 거짓 보안의 의미를 암호화하는 경우,메모리,하지만 구멍을 다른 시스템에서,또는 노출 필요하지 않습니다.할 수 있는 것과 같은 잠에서 문지만 떠나는 창이 열립니다.

는 방법에 대해 뭔가가 이것을 좋아하는가?

procedure WipeString(const str: String);
var
  i:Integer;
  iSize:Integer;
  pData:PChar;

begin
    iSize := Length(str);
    pData := PChar(str);

    for i := 0 to 7 do
    begin
      ZeroMemory(pData, iSize);
      FillMemory(pData, iSize, $FF); // 1111 1111
      FillMemory(pData, iSize, $AA); // 1010 1010
      FillMemory(pData, iSize, $55); // 0101 0101
      ZeroMemory(pData, iSize);
    end;
end;

DLLs 지 않는 자신의 할당되는 메모리,프로세스는 않습니다.메모리 할당하여 귀사의 특정 프로세스는 폐기되면 프로세스가 종료하는지 여부,DLL 중단위(기 때문에 그것은 다른 프로세스에서 사용)또는 아닙니다.

는 방법에 대한 파일을 해독하여 스트림을 사용하여 삭스 프로세서 대신 XML DOM 을 확인하고 다음을 덮어 해독하기 전에 자유롭게?

당신이 사용하는 경우 FastMM 메모리 관리자가 전체에 디버깅 모드에,당신할 수 있는 힘이 그것을 덮어쓰기는 메모리할 때 해제됩니다.

일반적으로 하는 행동을 감지하는 데 사용 야생의 포인터이지만,그것은 또한 사용할 수 있습니다 무엇을 위해 당신니다.

다른 한편으로,것을 이해하기 위하여 확인 크레이그 Stuntz 씁니다:쓰지 않는 이 인증 및 허가 물건을 자신을 사용하여 기본 운영 체제할 때마다 가능합니다.

BTW:의 Vassbotn 썼 좋은 블로그에 대한 FastMM:http://hallvards.blogspot.com/2007/05/use-full-fastmm-consider-donating.html

감사합니다,

Jeroen Pluimers

지저분한 그러나 수의 힙 크기는 사용하는 동안 당신은 힙 가득한 중요 데이터로 할 때 다음을 발표 할 GetMem 할당 당신은 큰 덩어리를 걸쳐(말)200%습니다.지 채우에는 덩어리 및 가정 하는 모든 조각 unlinkely 을 많이 사용하는 심사원.Bri

는 방법에 대한 유 비밀번호로 해쉬값을에서는 XML 및 확인을 비교해서의 해시 입력한 암호와 해시 비밀번호에 XML.

편집:유지할 수 있습니다 모든 중요한 데이터 암호화 및 암호 해독에서만 가능한 마지막 순간입니다.

는 것이 가능할을 로드하는 해독 XML 으로 배열의 숯이나 바이트는 문자열이 아닌?다음도 없을 것입본 처리,그래서 당신이 할 수있을 것입 백필 메모리로#0 하기 전에 해방은?

할 경우 주의 할당하는 char 배열의 문자열로,델파이로는 몇 가지 스마트 처리기와의 호환성을 위해 전통적인 포장 array[1..x]char.

또한,사용할 수 있 ShortString?

을 사용하는 경우에는 XML,심지어 암호화된 암호를 저장하는 귀하의 당 사용자가 위험합니다.더 좋은 방법이 될 것을 저장하는 해시의 값을 대신 암호,그리고 다음을 비교 해쉬에 대하여는 입력한 암호입니다.이 방식의 장점은 것은 알고 해쉬값을,당신은 하지 않습니다 암호를 알고 있는 해시입니다.추가 brute force 식별자(수 잘못된 암호를 시도하고,잠금 계정이 특정 숫자)를 증가 security 니다.

방법은 여러 가지가 있을 만드는 데 사용할 수 있는 해시의 문자열입니다.좋은 출발점이 될 것 이 보는 터보 힘 오픈 소스"프로젝트LockBox"나는 그것을 믿는 몇 가지 예의 하나를 만드는 방법으로 해시 키를 사용합니다.

편집

하지만 어떻게 아는 해쉬값을 경우 그 방법 중 하나 도움이 되나요?면 정말 편집,수정할 수 있습니다 해쉬값을 무언가에 의해 prediticable 는 것을 알고...말하는 임의의 번호를 사용하여 특정한 종자 가치를 더합니다.다만 저장을 충분히 해시에서 당신의 xml 을 사용할 수 있도록 시작점으로 비교입니다.좋은 일에 대해 의사 난수를 발생기들은 그들은 항상 생성할 동일한 시리즈의"무작위"주어진 숫자 같은 씨앗이다.

주의의 기능을 치료하기 위해 노력 문자열로 포인터를 사용하려고 FillCharZeroMemory 를 닦아 문자열 내용입니다.

  • 이것은 잘못된(문자열은 공유당신을 속이고 다른 사람의 현재를 사용하는 문자열)
  • 는 원인이 될 수 있습 액세스 위반이(문자열이 발생되는 일정한,그것은 앉아서 읽기 전용 데이터 페이지에서 프로세스 주소 공간고 쓰려고 하면 그것은 액세스 위반이)

 

procedure BurnString(var s: UnicodeString);
begin
    {
        If the string is actually constant (reference count of -1), then any attempt to burn it will be
        an access violation; as the memory is sitting in a read-only data page.

        But Delphi provides no supported way to get the reference count of a string.

        It's also an issue if someone else is currently using the string (i.e. Reference Count > 1).
        If the string were only referenced by the caller (with a reference count of 1), then
        our function here, which received the string through a var reference would also have the string with
        a reference count of one.

        Either way, we can only burn the string if there's no other reference.

        The use of UniqueString, while counter-intuitiave, is the best approach.
        If you pass an unencrypted password to BurnString as a var parameter, and there were another reference,
        the string would still contain the password on exit. You can argue that what's the point of making a *copy*
        of a string only to burn the copy. Two things:

            - if you're debugging it, the string you passed will now be burned (i.e. your local variable will be empty)
            - most of the time the RefCount will be 1. When RefCount is one, UniqueString does nothing, so we *are* burning
                the only string
    }
    if Length(s) > 0 then
    begin
        System.UniqueString(s); //ensure the passed in string has a reference count of one
        ZeroMemory(Pointer(s), System.Length(s)*SizeOf(WideChar));

        {
            By not calling UniqueString, we only save on a memory allocation and wipe if RefCnt <> 1
            It's an unsafe micro-optimization because we're using undocumented offsets to reference counts.

            And i'm really uncomfortable using it because it really is undocumented.
            It is absolutely a given that it won't change. And we'd have stopping using Delphi long before
            it changes. But i just can't do it.
        }
        //if PLongInt(PByte(S) - 8)^ = 1 then //RefCnt=1
        //  ZeroMemory(Pointer(s), System.Length(s)*SizeOf(WideChar));

        s := ''; //We want the callee to see their passed string come back as empty (even if it was shared with other variables)
    end;
end;

일단 당신이 UnicodeString 버전을 만들 수 있습니다 AnsiStringWideString versions:

procedure BurnString(var s: AnsiString); overload;
begin
    if Length(s) > 0 then
    begin
        System.UniqueString(s);
        ZeroMemory(Pointer(s), System.Length(s)*SizeOf(AnsiChar));

        //if PLongInt(PByte(S) - 8)^ = 1 then //RefCount=1
        //  ZeroMemory(Pointer(s), System.Length(s)*SizeOf(AnsiChar));

        s := '';
    end;
end;

procedure BurnString(var s: WideString);
begin
    //WideStrings (i.e. COM BSTRs) are not reference counted, but they are modifiable
    if Length(s) > 0 then
    begin
        ZeroMemory(Pointer(s), System.Length(s)*SizeOf(WideChar));

        //if PLongInt(PByte(S) - 8)^ = 1 then //RefCount=1
        //  ZeroMemory(Pointer(s), System.Length(s)*SizeOf(AnsiChar));

        s := '';
    end;
end;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top