1. 程式人生 > >ruby獲取本機mac加密生成lisence檔案,客戶端根據lisence許可呼叫主程式

ruby獲取本機mac加密生成lisence檔案,客戶端根據lisence許可呼叫主程式

需求:

提取客戶本機Mac地址,生成Md5值。(客戶使用,提供給廠商)

對該Md5值進行加密,生成lisence.txt檔案。(廠商生成)

獲取當前目錄的lisence檔案,解密,如果解密後與加密之前的md5值相等,則允許使用者執行主程式。(客戶使用)

一、使用macaddr獲取本機mac地址。

macaddr下載地址:https://github.com/ahoward/macaddr

下載後執行命令:gem install macaddr

執行後會在ruby安裝目錄相應位置生成macaddr-1.7.1、systemu-2.6.5(macaddr依賴包)資料夾。如我的是在:C:\Ruby23\lib\ruby\gems\2.3.0\gems\。

對macaddr進行修改:找到~/macaddr-1.7.1/lib/macaddr.rb檔案,將以下程式碼註釋:

 #   @mac_address = from_getifaddrs
 #   return @mac_address if @mac_address

即:只是用systemu獲取Mac地址。

可編寫一個mac.rb的ruby檔案,用於獲取Mac地址並生成md5值並列印,內容如下:

require 'macaddr'
require 'digest'

#Mac.addr      #=> first mac addr on your system
#Mac.addr.list #=> all mac addrs on your system

puts Digest::MD5.hexdigest(Mac.addr.list.to_s)

二、加密生成的md5值,生成lisence檔案

編寫lisence.rb,內容如下:

require 'openssl'
require 'pathname'

$Key = ".........."  #使用key = rand(36 ** 128).to_s(36)生成128位的祕鑰

def aes_encrypt(encrypted_string)
    aes = OpenSSL::Cipher::Cipher.new("AES-128-ECB")
    aes.encrypt
    aes.key = $Key

    txt = aes.update(encrypted_string) << aes.final
    return txt.to_s
end

puts "Please input decode message:"
var = STDIN.gets
#puts var

#puts aes_encrypt(var)


dir = File.join("#{Dir.pwd}", "lisence.txt")  #執行該程式後會在當前目錄生成一個lisence.txt檔案

file = File.new(dir,'w+')
if file
	file.syswrite(aes_encrypt(var))
	file.close
else
	puts "Unable to open file!!"
end

三、解密lisence檔案

在當前目錄中查詢lisence.txt檔案,獲取檔案內容,解密,並與加密之前的資料進行比對,相等則允許使用者訪問主程式。

def aes_dicrypt(dicrypted_string)
    aes = OpenSSL::Cipher::Cipher.new("AES-128-ECB")
    aes.decrypt
    aes.key = $Key       #$Key為第二步中的$Key的值
    abc=  aes.update(dicrypted_string) << aes.final
    return abc.to_s
end

path = Dir.pwd
	#puts path

	Dir.foreach(path){|f| 
		#puts f
		if f == "lisence.txt"
			content = ""
			IO.foreach(f){|con| 
				content = content + con
			} 
			#puts content
				decode =  aes_dicrypt(content)				
				encode = Digest::MD5.hexdigest(Mac.addr.list.to_s)
				#puts decode
				#puts encode
				if decode.chomp != encode.chomp   #加密前和加密後的值不等,則退出程式。否則,執行主程式
					exit
				end
			break
		end
	}
以上程式碼可置於主程式呼叫之前。

可分別將上述.rb檔案使用ocra打包成exe檔案。如:

ocra C:/mac.rb

將會在當前目錄生成一個紅寶石圖示的exe檔案。