나도 원래 포스터와 같은 질문을했고 메커니즘을 이해하기 위해 주위를 둘러 보며 여러 가지 시도를했습니다. 다른 사람들이 이미 지적했듯이 솔트는 최종 해시에 연결됩니다. 따라서 이것은 몇 가지를 의미합니다.
- 알고리즘은 소금의 길이를 알아야합니다.
- 최종 문자열에서 소금의 위치도 알아야합니다. 예를 들어 왼쪽 또는 오른쪽에서 특정 숫자만큼 오프셋 된 경우.
이 두 가지가 일반적으로 하드 구현에 코딩 등의 bcrypt 구현 소스 bcryptjs는 16 소금 길이를 정의
var BCRYPT_SALT_LEN = 16;
따라서 아이디어의 기본 개념을 설명하기 위해 수동으로 수행하려는 경우 아래와 유사하게 보일 것입니다. 나는 당신이 그것을 할 수있는 라이브러리가있을 때 이와 같은 것을 직접 구현하는 것을 권장하지 않습니다.
var salt_length = 16;
var salt_offset = 0;
var genSalt = function(callback)
{
var alphaNum = '0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ';
var salt = '';
for (var i = 0; i < salt_length; i++) {
var j = Math.floor(Math.random() * alphaNum.length);
salt += alphaNum[j];
}
callback(salt);
}
var shar2 = function(str) {
}
var hash = function(passwordText, callback)
{
var passwordHash = null;
genSalt(function(salt){
passwordHash = salt + shar2(passwordText + salt);
});
callback(null, passwordHash);
}
var compare = function(passwordText, passwordHash, callback)
{
var salt = passwordHash.substr(salt_offset, salt_length);
validatedHash = salt + shar2(passwordText + salt);
callback(passwordHash === validatedHash);
}
var encryptPassword = function(user)
{
hash(user.pass, function(err, passwordHash){
user.pass = passwordHash;
});
return user;
}
var checkPassword = function(passwordText, user)
{
compare(passwordText, user.pass, function(result){
if (result){
console.log('Correct Password');
}
else {
console.log('Incorrect Password');
}
});
}