SecureStringToGlobalAllocAnsi .NetCLR

Попытка скомпилировать этот код с помощью Dnx CoreCLR

passValue = new byte[pass.Length];
GCHandle gch = GCHandle.Alloc(pinValue, GCHandleType.Pinned);
ptr = Marshal.SecureStringToGlobalAllocAnsi(pass); //Here NET CLR 
Marshal.Copy(ptr, passValue, 0, passValue.Length);
passValueLen = Convert.ToUInt32(passValue.Length);

Я получаю эту ошибку

CS0117: "Маршал" не содержит определения для "SecureStringToGlobalAllocAnsi"

Я уверен, что существует обходной путь для безопасной строки в ядре CLR.

1 ответ

Ответ часто в источнике

Поскольку Microsoft открыла исходный код.NET Framework, теперь довольно легко и законно взглянуть на реализацию каждого класса и получить любую полезную информацию.

Из этого вы можете найти, что Marshal.SecureStringToGlobalAllocAnsi(pass) более или менее призыв к SecureString.ToAnsiStr,

SecureString является частью пространства имен System.Security и в mscorlib.dll

Примечание. Некоторые методы.NET Framework не предназначены для работы вне среды Win32, особенно те, которые полагаются на Interop, COM, внешние вызовы VM. Из документации видно, что

.NET Core 5 - это модульная реализация среды выполнения и библиотеки, включающая подмножество.NET Framework

Таким образом, может работать только подмножество функций каркаса. Однако вы также можете запустить DNX на Mono. В случае, если вы пытаетесь запустить код в Unix или среде Android, вам следует попробовать Mono, потому что они немного опережают в плане поддерживаемых функций на этих платформах.

DNX был удален, как указано здесь, и теперь вы должны использовать CLI.

Вот выдержка из securestring.cs

    [System.Security.SecurityCritical]  // auto-generated
    [MethodImplAttribute(MethodImplOptions.Synchronized)]
#if FEATURE_CORRUPTING_EXCEPTIONS
    [HandleProcessCorruptedStateExceptions] 
#endif // FEATURE_CORRUPTING_EXCEPTIONS
    internal unsafe IntPtr ToAnsiStr(bool allocateFromHeap) {
        EnsureNotDisposed();

        IntPtr ptr = IntPtr.Zero;
        IntPtr result = IntPtr.Zero;          
        int byteCount = 0;
        RuntimeHelpers.PrepareConstrainedRegions();                        
        try {
            // GetAnsiByteCount uses the string data, so the calculation must happen after we are decrypted.
            UnProtectMemory();

            // allocating an extra char for terminating zero
            byteCount = GetAnsiByteCount() + 1; 

            RuntimeHelpers.PrepareConstrainedRegions();
            try {
            }
            finally {
                if( allocateFromHeap) {
                    ptr = Marshal.AllocHGlobal(byteCount);
                }
                else {
                    ptr = Marshal.AllocCoTaskMem(byteCount);
               }                    
            }

            if (ptr == IntPtr.Zero) {
                throw new OutOfMemoryException();
            }

            GetAnsiBytes((byte *)ptr.ToPointer(), byteCount);
            result = ptr;                
        }
        catch (Exception) {
            ProtectMemory();
            throw;
        }
        finally {
            ProtectMemory();
            if( result == IntPtr.Zero) { 
                // If we failed for any reason, free the new buffer
                if (ptr != IntPtr.Zero) {
                    Win32Native.ZeroMemory(ptr, (UIntPtr)byteCount);
                    if( allocateFromHeap) {                                                    
                        Marshal.FreeHGlobal(ptr);
                    }
                    else {
                        Marshal.FreeCoTaskMem(ptr);                            
                    }
                }                    
            }                

        }
        return result;
    }
Другие вопросы по тегам