2014-06-06 2 views
2

암호를 데이터베이스에 저장하는 방법에 대한 자습서를 따르고있었습니다. 'Node.JS Crypto.Hacac 암호 생성

hasher.computeHash = function(source, salt) { 
    var hmac = crypto.crypto.createHmac("sha1", salt); 
    var hash = hmac.update(source); 
    return hash.digest("hex"); 
}; 

나는 항상 내가 소금에 추가 비밀을 사용하는 비밀번호 암호화로 보았다 어느 때와 같이 혼동 얻고 이제까지 어떤 이유로,하지만 난 할 수 있습니다 그들은이 해시 된 암호를 생성하려면 다음을 사용 거기 밖으로 어떤 리소스를 찾으십시오 ... 내 말은 :

hasher.computeHash = function(source, salt) { 
    var saltNHash = salt + "super Secret LOOONG string!!"; 
    var hmac = crypto.crypto.createHmac("sha1", saltNHash); 
    var hash = hmac.update(source); 
    return hash.digest("hex"); 
}; 

이 방법이 좋지 않습니까? 노드 모듈 내에서 암호를 더 잘 수행하는 방법 (데이터베이스에 암호 저장)이 있습니까?

감사합니다. 중복되는 경우 죄송합니다. 주변을 둘러 보았지만 제대로 된 키워드를 알 수 있다고 생각하지 않습니다.

답변

3

Todd Yandell's answer을 따르고 bcrypt을 사용하는 것이 좋습니다. 느린 알고리즘 정말 원하는 암호입니다. 즉, 귀하의 질문에 대해서도 언급하겠습니다.

우리가 소금을 사용하는 이유에 대해 이야기 해 봅시다. 소금은 길이다.

  1. bruteforce 시도를 늦추십시오.
    소금을 사용하지 않으면 같은 암호를 가진 두 명의 사용자가 동시에 노출됩니다. 각 해시에 대해 개별적으로 모든 것을 소금물로 처리하면 공격자가 해시 시도를 N의 순서로 증가시킵니다.
  2. rainbow tables과 같은 사전 계산 공격을 방지합니다. 이 공격은 관련 해시의 속성과 계산 시간과 저장 공간 간의 균형을 사용하여 염분이없는 공격 알고리즘 (Windows XP 참조)을 빠르고 쉽게 만듭니다.

각 암호마다 무작위로 소금을 사용하고 있기 때문에 이미 도착하고 있습니다.

즉, 모든 것에 비밀을 추가하는 방법은 그렇게 유용하지 않습니다. 기술적으로 약간의 복잡성이 추가되지만, 단지 정적 문자열이기 때문에 모호함에 의한 보안보다 훨씬 좋지 않습니다. 단수의 비밀이 한 번 발견되면 (데이터베이스에 약 하나 또는 두 개의 약한 암호가 있거나 공격자가 컴퓨터에 액세스 할 수 있다면 상당히 쉽다), 더 이상 유용하지 않습니다. 당신의 무작위적인 소금을 고집하면 괜찮을 것입니다.

2

이 귀하의 질문에 직접 대답은 아니지만,이 암호 해시 bcrypt을 사용하는 것이 좋습니다 :

https://security.stackexchange.com/questions/16809/is-a-hmac-ed-password-is-more-secure-than-a-bcrypt-ed-or-scrypt-ed-password

다음은 HMAC와 bcrypt의 차이점을 설명하는 좋은 게시물입니다

var bcrypt = require('bcrypt'); 
bcrypt.genSalt(10, function (error, salt) { 
    bcrypt.hash(password, salt, function (error, hash) { 
    // save `hash` to your database 
    }); 
});