Gem 关于 fast-aes 对称加密

lonely21475 · 2014年01月09日 · 最后由 lonely21475 回复于 2014年03月17日 · 5200 次阅读

最近由于工作需要,在用户注册和登录因为是调用远程端口 要将填入数据加密以后再发送,用 get 方式容易被人反编译,所以就采用对称加密方式,刚开始研究了好几个 gem,但是都不与 PHP 的兼容,无法解析,系统自带的 openssl 虽然也是对称加密,但是无法使用,

1、在 gemfile 中 加入 gem 'fast-aes' 2, bundle install 3、在实用过程中发现 fast-aes 采用的 ecb 模式,即同一个字段经过加密处理生成的密文也是相同的 4、在用 base64 经行加密处理时,总是有"\n"的出现,所以应该对该特殊字段经行处理,否则会出错,解码无效 5、我 controller 方法如下,仅供参考

#encoding: utf-8
require 'base64'
require 'fast-aes'

class MeteorsController < ApplicationController

layout 'huaxuan'

  def login

  end
  #用于解决跨域传输的问题
  skip_before_filter :verify_authenticity_token, :only => [:login_create]

  def login_create

    if params[:username].blank?
      flash[:notice] ='登录帐号不能为空!'
      redirect_to login_url
    elsif params[:password].blank?
      flash[:notice] ='登录密码不能为空'
      redirect_to login_url
    else
      string = "username=#{params[:username]}&password=#{params[:password]}"

      key = 'UITN25LMUQC436IM'           #这是一个128bit的自定义密钥可以自定义
      aes = FastAES.new(key)

      string1 = aes.encrypt(string)
      string2 = Base64.encode64(string1)
      if string2.length==64
      else
        text = string2.gsub("\n",'')
      end

      redirect_to  "http://xxx.xxx.com/xxxx?{text.to_s}"

    end

  end
end

你这是发送的什么接口请求,完全无章法。就算是 php 发送请求,也得借助于 curl 的扩展。

看着像同步登录用的,让 client 去请求接口,而不是在 server 端请求接口

Base64.encode64 换成 Base64.strict_encode64 就不会有换行了。

Ruby 的 Aes 有长度不足,补全的动作,这个细节之前我也折腾了一下

key = 'UITN25LMUQC436IM'
def aes128_encrypt(data)
  aes = OpenSSL::Cipher::AES.new("128-ECB")
  aes.encrypt
  aes.padding = 0
  aes.key = key
  aes.update(data)
end

def aes128_decrypt(data)
  aes = OpenSSL::Cipher::AES.new("128-ECB")
  aes.decrypt
  aes.padding = 0
  aes.key = key
  aes.update(data)
end

我们现在项目的 AES 做法

string2 = Base64.encode64(string1)

换成

string2 = Base64.urlsafe_encode64(string1)

后面那个判断和 gsub 可以直接去掉了。

这玩意貌似挺热门的,我们也折腾了一回,然后发现 java 的 pading 和 fast-aes 不一样,就手工 padding 了 0.

加密我用的这个包 gem 'encryptor',支持很多种加密方式。

openssl 里不是自带 AES?还用其它 gem?

#6 楼 @martin 谢谢你提出的修正,已经调试成功了!

#8 楼 @windwiny fast-aes 就是这个 gem 你可以到 rubygems.org 去看看

#7 楼 @raofeng 这还没有尝试过,工作之余倒是想学学

#4 楼 @huacnlee 我也因为这个头疼,后来就换个思路去做了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号