短信平台接入的加密联想
2015-11-15 22:37
225 查看
最近公司有项目需要用到短信发送通知的功能,于是花了一些时间调研了几家短信平台.现在的短信平台所使用的短信发送协议,基本都是restful格式,已经简单到不能再简单的程度,这样做的好处一是可以跨语言,二是接入代价极小.一个地址而已,放入浏览器就可以直接发送短信,也为测试短信发送效果提供了便利.
下面就是一个例子:
http://www.duanxinpingtai.com/send.jsp?username=username&password=password&sim=13XXXXXXXXX&content=短信内容
可惜的是,这种便利也带来了不小的安全隐患.即使密码是已经加密的密码,也只能保证密码不被其他人破解而已,无法抵御重放攻击.或者,可以直接修改短信号码和短信内容,写入自己的业务,为自己谋取利益;更有甚者,可以把内容修改为营销类信息,结合现在国家打击营销短信的政策,对客户实施恶意攻击.
针对重放攻击,各家平台其实都提供了一些方法来防范,大部分都是提供了ip白名单的功能.这种方式的确可以保证短信的来源,可惜的是,针对某些客户,提供固定的ip地址也有一定代价,尤其是在现在ipv4已经枯竭的情况下.
其实,简单的认证客户端的方式已经有人提供出来了,实现代价也很小.就是使用hmac签名的方式.
hmac是基于共享密钥的散列,其算法提供类似如下功能:
MD5(共享密钥,sim+content) , 当然,使用MD5还是SHA1或者其他散列算法都是可以指定的.
更改后的格式变为了:
http://www.duanxinpingtai.com/send.jsp?username=username&password=password&sim=13XXXXXXXXX&content=短信内容&sign=XXXXXXXXX
共享密钥可以使用https的方式提供给客户,或者直接沟通获取.就短信发送而言,需要加密的内容包括短信号码,短信内容,加密的内容不能再被更改,否者签名字符串就无法匹配.这样一来,就可以有效防止善意的攻击,即修改短信号码或者内容为己所用的情况,但是依然无法防止重放攻击.要阻止重放攻击,或许可以在OTP算法中找到解决方案.
OTP算法,即一次性密码,该算法之前经常被银行用来作为验证用户.有些朋友或许记得,某些银行会给用户一个密码生成器,每按一次就可以生成一个6位的数字密码,用户转账或者进行某些重要操作时需要提供该数字密码.这就是由OTP算法来实现的.这种算法的基础即为hmac算法,该算法提供如下的类似效果:
MD5(共享密钥,时间值)
其中的共享密钥已经保存在了硬件中,同时也有一份在银行服务器中,只要双方时间值一致,因为使用了相同的算法,就能得到相同的数字密码,从而验证了用户的身份.这种即为基于时间的一次性密码,即TOTP.当然,TOTP算法中的时间值也可以是其他值,只要双方协商好,使用同一个值,就可以得出相同密码,比方说,验证过的次数,短信发送的条数等.这种算法即HTOP.
如果短信发送客户端和短信平台可以同时获取一样的发送短信的次数,那么就可以拒绝已经使用过的短信次数,从而避免重放攻击.修改后的格式如下:
http://www.duanxinpingtai.com/send.jsp?username=username&password=password&sim=13XXXXXXXXX&content=短信内容&count=XXX&sign=XXXXXXXXX
此时的sign应该是MD5(共享密钥,sim+content+count)
只要能保证count的递增性,就可以拒绝重放攻击了.
下面就是一个例子:
http://www.duanxinpingtai.com/send.jsp?username=username&password=password&sim=13XXXXXXXXX&content=短信内容
可惜的是,这种便利也带来了不小的安全隐患.即使密码是已经加密的密码,也只能保证密码不被其他人破解而已,无法抵御重放攻击.或者,可以直接修改短信号码和短信内容,写入自己的业务,为自己谋取利益;更有甚者,可以把内容修改为营销类信息,结合现在国家打击营销短信的政策,对客户实施恶意攻击.
针对重放攻击,各家平台其实都提供了一些方法来防范,大部分都是提供了ip白名单的功能.这种方式的确可以保证短信的来源,可惜的是,针对某些客户,提供固定的ip地址也有一定代价,尤其是在现在ipv4已经枯竭的情况下.
其实,简单的认证客户端的方式已经有人提供出来了,实现代价也很小.就是使用hmac签名的方式.
hmac是基于共享密钥的散列,其算法提供类似如下功能:
MD5(共享密钥,sim+content) , 当然,使用MD5还是SHA1或者其他散列算法都是可以指定的.
更改后的格式变为了:
http://www.duanxinpingtai.com/send.jsp?username=username&password=password&sim=13XXXXXXXXX&content=短信内容&sign=XXXXXXXXX
共享密钥可以使用https的方式提供给客户,或者直接沟通获取.就短信发送而言,需要加密的内容包括短信号码,短信内容,加密的内容不能再被更改,否者签名字符串就无法匹配.这样一来,就可以有效防止善意的攻击,即修改短信号码或者内容为己所用的情况,但是依然无法防止重放攻击.要阻止重放攻击,或许可以在OTP算法中找到解决方案.
OTP算法,即一次性密码,该算法之前经常被银行用来作为验证用户.有些朋友或许记得,某些银行会给用户一个密码生成器,每按一次就可以生成一个6位的数字密码,用户转账或者进行某些重要操作时需要提供该数字密码.这就是由OTP算法来实现的.这种算法的基础即为hmac算法,该算法提供如下的类似效果:
MD5(共享密钥,时间值)
其中的共享密钥已经保存在了硬件中,同时也有一份在银行服务器中,只要双方时间值一致,因为使用了相同的算法,就能得到相同的数字密码,从而验证了用户的身份.这种即为基于时间的一次性密码,即TOTP.当然,TOTP算法中的时间值也可以是其他值,只要双方协商好,使用同一个值,就可以得出相同密码,比方说,验证过的次数,短信发送的条数等.这种算法即HTOP.
如果短信发送客户端和短信平台可以同时获取一样的发送短信的次数,那么就可以拒绝已经使用过的短信次数,从而避免重放攻击.修改后的格式如下:
http://www.duanxinpingtai.com/send.jsp?username=username&password=password&sim=13XXXXXXXXX&content=短信内容&count=XXX&sign=XXXXXXXXX
此时的sign应该是MD5(共享密钥,sim+content+count)
只要能保证count的递增性,就可以拒绝重放攻击了.
相关文章推荐
- 测试职业发展如何做-1
- 1035. Password (20)
- Java如何集成支付宝即时到账接口
- UpdateData(TRUE)与 UpdateData(FALSE);
- 设计模式实例学习-责任链模式
- 黑马程序员——OC基础05—Foundation框架
- java基础的学习
- 初学python转义字符
- 【Loadrunner】检查点设置
- iOS Crash: dwarfdump 检查 UUID
- linux系统vi命令编辑后Ctrl+s“死机”
- TCP:传输控制协议
- DelegatingActionProxy
- HDU ACM 1050 Moving Tables
- 解决VS2010链接错误:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- 换行
- C语言关键字
- C语言的队列的初始化和先进先出的简洁程序
- linux 取得 UUID
- 电商设计中的一些概念