加密锁简单方案

自己方案:

  1. 准备一个加密锁,将用户信息(比如说用户名,用户唯一标识)写入到锁中。
    XXX科技公司提供加密锁,同时会提供一些API接口,还有简单的图形化界面操作锁的工具。可以调用接口向锁内创建数据文件, 也可以通过工具创建数据文件,创建文件的读权限为用户, 写权限为管理员。 调用接口API向文件中写入加密后(可以使用base64加密)用户信息。

  2. 点击登陆时,验证当前设备是否插入usb key。
    可以调用XXX公司提供的API接口(枚举锁),看是否能够找到锁信息。

  3. 如果能够找到锁,验证锁的用户PIN密码。
    如果找到锁,证明设备插入了加密锁。 调用XXX公司提供的API接口, 打开锁信息。获取用户输入的用户PIN码,对PIN码进行验证。这里验证的是用户的PIN码,而非开发商PIN码。

  4. 验证通过, 读取数据文件信息。
    调用XXX公司提供API读取存储的用户信息, 如果加密再进行解密。

  5. 验证用户信息。
    将从锁里获取的用户信息发送到后台, 后天通过与数据库比对,判定是否登陆成功。

不足:

这是一种只在客户端进行验证的方法。这样做是不安全的。如果对于用户B,假如任何知道用户B信息(存到锁里的信息),都可以不插入key而实现登陆系统。

例如:
在检查是否插入加密锁时,源码为:


加密锁简单方案_第1张图片
验证是否插入加密锁源码.png

从浏览器访问时:


加密锁简单方案_第2张图片
是否插入加密锁页面.png

对浏览器代码进行断点, 修改判断条件:


加密锁简单方案_第3张图片
是否插入加密锁页面修改.png

这样, 无论怎样都可以走打开锁的代码,其余的判断也是, 可以通过在浏览器进行修改, 从而达到使用用户信息访问系统的目的。

浏览器断点:

源码在Source下。F8下一个断点, F11下一步。 修改后Ctrl + s保存。

XXX公司给出简单方案:

可以不使用base64加密,使用锁内自带算法, RSA/ECC等都可以。

生成密钥对, 将私钥写入到锁内,使用公钥对用户信息加密, 将加密结果写到锁内, 验证的时候使用锁内的私钥解密,得到用户信息去验证。

公钥加密私钥解密与私钥加密公钥解密的区别:公钥是公开的, 大家都可以加,但是只有私钥(私钥存放在锁里)可以解密。如果私钥加密,那么锁公开的公钥(公钥可以不存在锁里)都可以解密。

这种方案很好的使用了加密锁, 只有使用加密锁内的私钥文件才能解密得到用户信息。 但是仔细想想,这一系列操作同样都是在客户端完成的,这样同样存在那个问题, 打开浏览器,修改浏览器页面调试源码,同样也可以登陆进入系统。

想法

可不可以使用普通的MD5或者base64在服务端加密, 将加密后的信息写入到锁里边。

然后把锁给用户, 用户即使看客户端源码也不知道用的是那种加密方式(因为往锁里边写数据的程序跟登陆程序不是同一个), 只能通过读锁得到加密后的结果,将结果传给服务器验证。

在服务器端对加密后的结果进行解密, 得到结果与数据库比对。

这样在只有我们签发锁的人才知道加解密算法的情况下或许相对安全, 但是如果想攻击, 可以使用枚举的方法(市面上的加密算法)进行解密, 也可以实现破解。

你可能感兴趣的:(加密锁简单方案)