2011년 3월 29일 화요일
해시값 생성
해시값은 digest 라고 불리기도 한다.
#!/usr/bin/ruby
require 'digest/md5'
s = "hello"
puts Digest::MD5.digest(s)
puts Digest::MD5.hexdigest(s)
puts Digest::MD5.base64digest(s) # 1.9.1
Cipher 를 사용한 AES 암호화 예제
# coding: utf-8
require 'openssl'
require 'digest'
# setup
password = 'password'
key = Digest::SHA256.digest password
# encrypt
encipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
encipher.encrypt
# key 길이가 같아야 한다. 길이가 클 경우 큰 부분이 무시되므로 안전하지 않다
# 여기서는 항상 같다
if encipher.key_len == key.length
encipher.key = key
else
raise "key length mismatch"
end
# iv 을 설정하지 않을 경우 기본값으로 null 값이 할당된다.
# iv = "\x00" * iv_len
encrypted_text = encipher.update('This is a message.')
encrypted_text << encipher.final
# decrypt
decipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
decipher.decrypt
decipher.key = key
decrypted_text = decipher.update(encrypted_text)
decrypted_text << decipher.final
사용하기 편리하게 String 클래스에 합체해보자.
# coding: utf-8
class String
# iv 을 설정하지 않을 경우 기본값으로 null 값이 할당된다.
# iv = "\x00" * iv_len
def encrypt password
encipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
encipher.encrypt
encipher.key = Digest::SHA256.digest password
encrypted_text = encipher.update(self)
encrypted_text << encipher.final
end
def decrypt password
decipher = OpenSSL::Cipher::Cipher.new("aes-256-cbc")
decipher.decrypt
decipher.key = Digest::SHA256.digest password
decrypted_text = decipher.update self
decrypted_text << decipher.final
decrypted_text.force_encoding("utf-8")
end
end
encrypted_string = "암호화 테스트입니다.".encrypt("password")
decrypted_string = encrypted_string.decrypt("password")
p [encrypted_string, decrypted_string]
댓글 없음:
댓글 쓰기