Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

루비에는 마법이 없다

Rails/Ruby에 마법이 너무 많다는 말을 들어보셨을 수도 있습니다.

  • 그런데 그 아이디어는 어디서 나온 거죠?
  • Rails의 마법이란 정확히 무엇인가요?
  • 그리고 그 마법을 없애기 위해 무엇을 할 수 있나요?

내 생각은 이렇다 :

무언가가 마술처럼 느껴질 때 그것은 당신이 모르는 무언가가 있기 때문에 일부 정보가 빠져 있기 때문입니다.

마치 마술처럼 비법을 알면 마술은 없다 .

루비에는 마법이 없다

소프트웨어 개발에서 트릭을 아는 것은 실제로 작동하는 방식을 이해하는 것과 같습니다. .

예시를 보자!

이 예는 BCrypt에 관한 것입니다. , 암호를 안전하게 저장하는 데 사용되는 해싱 알고리즘입니다. bcrypt를 통해 Ruby에서 구현됩니다. 보석.

BCrypt를 사용하는 방법은 다음과 같습니다. "testing"이라는 단어를 해시하려면:

'bcrypt'BCrypt::Password.create("testing")# "$2a$10$3o.xrISG8fqKfzKqDpgKn.3cwjFV//9C9cZ7MuK5S9sNKFBivB7YG"BCrypt::Password.create($2a) 필요 
 매번 다른 해시를 얻는 방법에 주목하세요. 그러나 MD5(사용하지 마세요!) 또는 SHA1과 같은 것을 사용하면 주어진 문자열에 대해 항상 동일한 출력을 얻을 수 있습니다.

BCrypt입니까? 다른 방식으로 행동합니까?

무슨 일이 일어나고 있는지 잠시 후에 설명하겠지만 먼저 두 bcrypt를 비교하는 방법을 살펴보겠습니다. 해시, 하나는 데이터베이스에서, 하나는 사용자 입력에서 가져옵니다(예:양식 또는 이와 유사한 것).

BCrypt::Password.new(@user.hash) ==params[:password]# true

왼쪽 부분(BCrypt::Password.new )은 BCrypt입니다. 데이터베이스에 저장된 해시를 매개변수로 사용하는 개체입니다.

오른쪽 부분(params[:password] )은 사용자가 로그인하려는 일반 텍스트 암호입니다.

이 경우 올바른 사용자/비밀번호 조합이 사용되고 있다고 가정합니다.

그렇다면 이것이 true로 평가되는 이유는 무엇입니까? ?

이를 이해하려면 다음 두 가지를 알아야 합니다.

  1. BCrypt는 보안을 강화하기 위해 사용되는 임의의 값인 "소금"이라는 것을 사용합니다. 미리 계산된 해시에 대해 소금은 해시 자체에 저장됩니다.
  2. Ruby에서는 구문처럼 보이는 많은 것들이 단지 메소드일 뿐입니다. . 이중 등호 연산자(== ).

그것을 알면 BCrypt 자체 == 정의 비밀번호를 비교할 때 이를 고려할 수 있도록 해당 "소금" 값을 추출하는 방법을 알고 있는 메소드입니다.

:

BCrypt#== 저장된 해시에서 "소금" 값을 가져옵니다.

그런 다음 이 솔트를 사용하여 일반 텍스트 암호(사용자 입력)를 해시하므로 암호가 유효한 경우 두 해시가 동일합니다.

소스 코드를 살펴보려면 다음과 같이 보일 것입니다:

def ==(비밀) 슈퍼( BCrypt::Engine.hash_secret(비밀, @salt) )end

super 동일한 메소드를 호출합니다(이 경우 == ) 상위 클래스에서.

BCrypt::Password의 상위 클래스 String입니다. .

방법에 관한 모든 것

이해해야 할 한 가지 중요한 점은 몇 가지 키워드와 몇 가지 구문 요소(예:괄호) 외에는 모두 클래스와 메서드에 관한 것입니다.

작업 중인 클래스를 알고 있는 경우(class를 사용하여 확인할 수 있습니다. 방법) 어떤 작업(방법)을 사용할 수 있는지 항상 알 수 있습니다.

그러나 때때로 우리는 객체 없이 메소드를 호출합니다.

이것은 종종 메서드가 현재 클래스에 정의되어 있음을 의미하지만 항상 그런 것은 아닙니다.

:

123개

puts은(는) 어디에 있습니까? 한정된? 알아보자:

method(:puts).owner# 커널

혼란스러울 수 있는 또 다른 사항은 메타프로그래밍입니다. 메타프로그래밍을 사용하면 프로그램 실행 중에 메서드를 생성, 수정 또는 제거할 수 있기 때문입니다. 이러한 것들은 코드를 더 불투명하고 모호하게 만듭니다.

사용 가능한 메타프로그래밍 방법과 작동 방식을 알고 있으면 혼란을 줄일 수 있습니다.

요약

작동 방식에 대한 깊은 이해가 "마법"을 없애고, 더 나은 코드를 작성하고, 더 나은 개발자로 만드는 데 어떻게 도움이 되는지 배웠습니다.

Ruby 기술을 향상시키려면 기본과 고급 개념 간의 격차를 해소하도록 설계된 내 책 Ruby Deep Dive를 확인하세요. 🙂