문제

Google 전체를 검색했지만 다음을 사용하여 Scrypt 사용(비밀번호 해싱용)에 대한 코드 샘플을 찾을 수 없습니다. 크립트샤프 도서관.

비밀번호 해싱을 위한 샘플을 제공해 주실 수 있나요?

도움이 되었습니까?

해결책

그건 단지 한 번의 전화 매개변수를 안내해 드리겠습니다.

  1. key:이것이 귀하의 비밀번호입니다. UTF-8 인코딩(바이트 순서 표시 없음)을 사용하여 비밀번호를 바이트 배열로 인코딩합니다.
  2. salt:scrypt 함수의 결과와 함께 저장된 보안 임의 바이트 문자열, 16바이트이면 충분합니다.
  3. cost:주어진 제안은 262144이지만 서버가 추가 로드를 처리할 수 있으면 해당 값을 늘릴 수 있습니다.
  4. blockSize:비용을 참조하세요. 주어진 제안은 8입니다.
  5. parallel:멀티스레딩을 실험하고 싶지 않다면 이 값을 1로 유지하겠습니다.
  6. maxThreads:일반적으로 null 잘 할 것이다;
  7. derivedKeyLength:글쎄요, 비밀번호 128이면 충분하지만 비밀번호에 128비트 이상의 보안이 있을 가능성은 없습니다.

최소한 소금과 결과를 저장해야 합니다.문자열로 저장하려면 Base 64 인코딩을 사용할 수 있습니다.

하나의 추가 데이터를 저장하는 것이 좋습니다.비밀번호 기반 키 파생 체계(PBKDF) 버전입니다.다음으로 설정해 보세요. 1 scrypt 사용, 주어진 키 인코딩, 솔트 크기, 비용, 블록 크기 등을 사용합니다.이 경우 나중에 구성표를 업그레이드할 수 있습니다(이 작업을 수행하려면 사용자가 자신의 비밀번호를 제공해야 하므로 이 작업을 온라인으로 수행해야 하므로 결국 여러 구성표가 동시에 작동하게 됩니다).

PBKDF 함수 호출을 연결할 수 있으므로 원래 PBKDF 출력을 사용하고 이를 다음 PBKDF의 입력으로 사용할 수 있습니다.이 경우 사용자는 비밀번호를 제공할 필요가 없습니다(이 힌트는 다른 질문에 대한 CodesInChaos에서 가져옴).

다른 팁

@maartebbodewes는 매우 현명한 추가 팁으로 훌륭한 답변을 제공합니다.다음은 권장 사항이있는 코드 샘플입니다.나는 또한 ' 비밀번호가 너무 짧아졌습니다 '글쓰기 시점에서와 같은 현대 암호화를 사용하는 것의 중요성을 보여줍니다 (서면시) bcrypt 또는 scrypt .

public string Hash(string secret, string salt)
{
    var keyBytes = Encoding.UTF8.GetBytes(secret);
    var saltBytes = Encoding.UTF8.GetBytes(salt);
    var cost = 262144;
    var blockSize = 8;
    var parallel = 1;
    var maxThreads = (int?)null;
    var derivedKeyLength = 128;

    var bytes = SCrypt.ComputeDerivedKey(keyBytes, saltBytes, cost, blockSize, parallel, maxThreads, derivedKeyLength);
    return Convert.ToBase64String(bytes);
}
.

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