시스템의 대안.웹.보안.회원가입.aspnetcore에서 암호 생성(netcore app1.0)
다른 대안이 있습니까?System.Web.Security.Membership.GeneratePassword
인에AspNetCore
(netcoreapp1.0
).
가장 쉬운 방법은 그냥 a를 사용하는 것일 것입니다.Guid.NewGuid().ToString("n")
비밀번호를 사용할 수 있을 정도로 길지만 완전히 무작위는 아닙니다
여기에 작동하는 출처에 기반한 클래스/방법이 있습니다.NET Core:
public static class Password
{
private static readonly char[] Punctuations = "!@#$%^&*()_-+=[{]};:>|./?".ToCharArray();
public static string Generate(int length, int numberOfNonAlphanumericCharacters)
{
if (length < 1 || length > 128)
{
throw new ArgumentException(nameof(length));
}
if (numberOfNonAlphanumericCharacters > length || numberOfNonAlphanumericCharacters < 0)
{
throw new ArgumentException(nameof(numberOfNonAlphanumericCharacters));
}
using (var rng = RandomNumberGenerator.Create())
{
var byteBuffer = new byte[length];
rng.GetBytes(byteBuffer);
var count = 0;
var characterBuffer = new char[length];
for (var iter = 0; iter < length; iter++)
{
var i = byteBuffer[iter] % 87;
if (i < 10)
{
characterBuffer[iter] = (char)('0' + i);
}
else if (i < 36)
{
characterBuffer[iter] = (char)('A' + i - 10);
}
else if (i < 62)
{
characterBuffer[iter] = (char)('a' + i - 36);
}
else
{
characterBuffer[iter] = Punctuations[i - 62];
count++;
}
}
if (count >= numberOfNonAlphanumericCharacters)
{
return new string(characterBuffer);
}
int j;
var rand = new Random();
for (j = 0; j < numberOfNonAlphanumericCharacters - count; j++)
{
int k;
do
{
k = rand.Next(0, length);
}
while (!char.IsLetterOrDigit(characterBuffer[k]));
characterBuffer[k] = Punctuations[rand.Next(0, Punctuations.Length)];
}
return new string(characterBuffer);
}
}
}
생략했습니다.do...while
필요하면 다시 추가할 수 있습니다.
이런 식으로 사용하면 됩니다.
var password = Password.Generate(32, 12);
또한 참고하시기 바랍니다.System.Security.Cryptography.Algorithms
.
시스템.랜덤은 보안상의 이유로 사용될 때 충분한 엔트로피를 제공하지 못합니다.
https://cwe.mitre.org/data/definitions/331.html
C# 클래스 시스템을 사용하는 이유.시스템 대신 랜덤입니다.보안.암호학.난수 생성기?
@khellang 버전의 보다 안전한 버전은 아래 예를 참조하십시오.
public static class Password
{
private static readonly char[] Punctuations = "!@#$%^&*()_-+[{]}:>|/?".ToCharArray();
public static string Generate(int length, int numberOfNonAlphanumericCharacters)
{
if (length < 1 || length > 128)
{
throw new ArgumentException("length");
}
if (numberOfNonAlphanumericCharacters > length || numberOfNonAlphanumericCharacters < 0)
{
throw new ArgumentException("numberOfNonAlphanumericCharacters");
}
using (var rng = RandomNumberGenerator.Create())
{
var byteBuffer = new byte[length];
rng.GetBytes(byteBuffer);
var count = 0;
var characterBuffer = new char[length];
for (var iter = 0; iter < length; iter++)
{
var i = byteBuffer[iter] % 87;
if (i < 10)
{
characterBuffer[iter] = (char)('0' + i);
}
else if (i < 36)
{
characterBuffer[iter] = (char)('A' + i - 10);
}
else if (i < 62)
{
characterBuffer[iter] = (char)('a' + i - 36);
}
else
{
characterBuffer[iter] = Punctuations[GetRandomInt(rng, Punctuations.Length)];
count++;
}
}
if (count >= numberOfNonAlphanumericCharacters)
{
return new string(characterBuffer);
}
int j;
for (j = 0; j < numberOfNonAlphanumericCharacters - count; j++)
{
int k;
do
{
k = GetRandomInt(rng, length);
}
while (!char.IsLetterOrDigit(characterBuffer[k]));
characterBuffer[k] = Punctuations[GetRandomInt(rng, Punctuations.Length)];
}
return new string(characterBuffer);
}
}
private static int GetRandomInt(RandomNumberGenerator randomGenerator)
{
var buffer = new byte[4];
randomGenerator.GetBytes(buffer);
return BitConverter.ToInt32(buffer);
}
private static int GetRandomInt(RandomNumberGenerator randomGenerator, int maxInput)
{
return Math.Abs(GetRandomInt(randomGenerator) % maxInput);
}
}
언급URL : https://stackoverflow.com/questions/38995379/alternative-to-system-web-security-membership-generatepassword-in-aspnetcore-ne
'programing' 카테고리의 다른 글
(현) 리터럴의 범위 (0) | 2023.10.01 |
---|---|
Oracle은 오류 발생 시 트랜잭션을 롤백합니까? (0) | 2023.10.01 |
잘못된 사용 부작용 연산자 함수 내에 삽입 (0) | 2023.10.01 |
-> C 구조체의 형식 인수가 잘못되었습니다. (0) | 2023.10.01 |
주소 ()를 취하고 값을 주는 함수 (0) | 2023.10.01 |