답변:
당신은하지 않습니다. SecureString 개체를 사용하는 모든 이유는 문자열 개체 (메모리에로드되고 가비지 수집 전까지 일반 텍스트로 유지됨)를 만들지 않기위한 것입니다. 그러나 문자를 추가하여 SecureString에 문자를 추가 할 수 있습니다.
var s = new SecureString();
s.AppendChar('d');
s.AppendChar('u');
s.AppendChar('m');
s.AppendChar('b');
s.AppendChar('p');
s.AppendChar('a');
s.AppendChar('s');
s.AppendChar('s');
s.AppendChar('w');
s.AppendChar('d');
12345
... 그건 바보가 짐에 가지고있는 그런 것!"
*****
AppendChar
런타임까지 실행되지 않으므로 해당 문자는 여전히 IL에서 읽을 수 있습니다. 맞습니까? 컴파일 타임 난독 화도 도움이 될 수 있습니다. 즉, 암호를 하드 코딩하는 경우입니다.
SecureString
와 사이를 변환하는 또 다른 방법이 있습니다 String
.
1. 문자열을 SecureString으로
SecureString theSecureString = new NetworkCredential("", "myPass").SecurePassword;
2. SecureString에서 문자열로
string theString = new NetworkCredential("", theSecureString).Password;
여기에 링크가 있습니다
SecureString
코드 string
에서 보안하려는 값을 가진 객체를 만드는 경우 를 사용하는 것은 의미가 없습니다 . 목표는 SecureString
관리되는 메모리에 문자열이 포함되지 않도록하는 것이므로 해당 메모리를 검사하는 공격자가 숨기려는 값을 찾을 수 있습니다. 때문에 NetworkCredential
당신이 호출하는 생성자는 ... 물론을 갈 수있는 방법은 아니다 문자열을, 필요, 코드는에와 SecureString 변환하는 쉬운 방법이지만, 그것을 사용하는 간단한을 사용하는 등 안전뿐만 코드를 만든다string
SecureString
일부 라이브러리로 작업 할 때 여전히 사용해야합니다 . 솔직히 누군가가 애플리케이션의 메모리를 적극적으로 스캔하고 있다면 이미 잃어버린 것입니다. 내가 본 적이없는 SecureString을 올바르게 사용하더라도 추출 할 다른 귀중한 데이터가있을 것입니다.
아래 방법은 문자열을 보안 문자열로 변환하는 데 도움이됩니다.
private SecureString ConvertToSecureString(string password)
{
if (password == null)
throw new ArgumentNullException("password");
var securePassword = new SecureString();
foreach (char c in password)
securePassword.AppendChar(c);
securePassword.MakeReadOnly();
return securePassword;
}
다음은 저렴한 linq 트릭입니다.
SecureString sec = new SecureString();
string pwd = "abc123"; /* Not Secure! */
pwd.ToCharArray().ToList().ForEach(sec.AppendChar);
/* and now : seal the deal */
sec.MakeReadOnly();
나는 이것을 밖으로 버릴 것이다. 왜?
모든 문자열을 보안 문자열로 변경할 수 없으며 갑자기 애플리케이션이 "보안"됩니다. 보안 문자열은 문자열을 가능한 한 오랫동안 암호화하고 매우 짧은 시간 동안 만 해독하여 작업이 수행 된 후 메모리를 지우도록 설계되었습니다.
응용 프로그램 문자열 보안에 대해 걱정하기 전에 처리해야 할 몇 가지 디자인 수준 문제가있을 수 있습니다. 귀하가하려는 작업에 대한 추가 정보를 제공해 주시면 더 나은 도움을 드릴 수 있습니다.
모든 문자를 손으로 추가하지 않고 평범하고 간단합니다.
var str = "foo";
var sc = new SecureString();
foreach(char c in str) sc.appendChar(c);
var sc = new SecureString(); foreach(char c in "foo") sc.appendChar(c);
저는 모든 사람들에게 "그게 요점이 아닙니다"라고 말하고 싶습니다. SecureString
이 질문을하는 많은 사람들이 어떤 이유에서든 정당화 되든 그렇지 않든간에 특별히 걱정 하지 않는 응용 프로그램에있을 수 있습니다. 비밀번호의 임시 사본은 GC 가능 문자열로 힙에 있지만 , 비밀번호가 힙에 있는지 여부 만 승인 하는 API를 사용해야합니다. 내부 용일 수도 있고 비밀번호가 필요하기 때문에 거기에만 있습니다. 기본 네트워크 프로토콜에 의해 암호가 저장된 문자열은 예를 들어 원격 PowerShell Runspace를 설정하는 데 사용할 수 없다는 것을 알았습니다.하지만이를 생성하는 데 쉽고 간단한 한 줄은 없습니다.SecureString
객체 합니다. 그래서 당신은 당신이 신경 쓰지 않는 앱을 가지고 있습니다.SecureString
필요한 것을 . 사소한 불편 함이지만 실제로 필요한 응용 프로그램이 작성자 나 중개자 를 사용하도록 유혹 하지 않도록하는 것이 그만한 가치가 있습니다 . :-)SecureString
System.String
System.Char[]
당신이 변환을 압축하려는 경우 string
A를 SecureString
에 LINQ
문은 다음과 같이 당신은 그것을 표현할 수있다 :
var plain = "The quick brown fox jumps over the lazy dog";
var secure = plain
.ToCharArray()
.Aggregate( new SecureString()
, (s, c) => { s.AppendChar(c); return s; }
, (s) => { s.MakeReadOnly(); return s; }
);
그러나을 사용 LINQ
해도이 솔루션의 보안이 향상되지는 않습니다. 에서 로의 변환과 동일한 결함 string
이 SecureString
있습니다. 원본 string
이 메모리에 남아있는 한 데이터는 취약합니다.
즉, 위의 명령문이 제공 할 수있는 것은를 생성 SecureString
하고 데이터로 초기화하고 마지막으로 수정하지 못하도록 잠그는 것입니다.
다음 2 개의 확장이 트릭을 수행해야합니다.
A에 대한 char
어레이
public static SecureString ToSecureString(this char[] _self)
{
SecureString knox = new SecureString();
foreach (char c in _self)
{
knox.AppendChar(c);
}
return knox;
}
그리고 string
public static SecureString ToSecureString(this string _self)
{
SecureString knox = new SecureString();
char[] chars = _self.ToCharArray();
foreach (char c in chars)
{
knox.AppendChar(c);
}
return knox;
}
추천 해 주신 John Dagg 에게 감사드립니다 AppendChar
.
이 간단한 스크립트를 사용할 수 있습니다.
private SecureString SecureStringConverter(string pass)
{
SecureString ret = new SecureString();
foreach (char chr in pass.ToCharArray())
ret.AppendChar(chr);
return ret;
}
Array.Clear