需求:
提取客户本机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文件。