- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
注意:我最初将其发布到 Information Security ,但我开始认为它在这里可能更相关,因为它实际上是关于确定我应该如何处理请求而不是保护信息。
A
:我有一个向用户提供请求的系统 A
。该服务器执行某些操作,然后将用户重定向到系统 B
。在该重定向期间,服务器 A
可以为用户提供一个 32 个字符的字母数字字符串以传递给系统 B
。需要该信息的 31 个字符,但可以将一个字符用作校验和。这个字符串或多或少可以被认为是一个请求 ID。
B
:当系统 B
收到用户的请求时,它可以通过解析 31 个字符的字符串、查询数据库并与系统 A 对话来验证请求(和类似 ID 的字符串)是否有效。该系统可以绝对肯定地验证请求是有效的并且没有被篡改,但它的计算量非常大。
这个系统很可能会看到许多欺骗 ID 的尝试。这会被后来的检查过滤,所以我不担心单个字符完美地签署了 ID,但是我确实希望避免在处理这些请求时花费更多的资源。
我正在寻找一种校验和/签名方案,它可以通过单个字符让我很好地了解请求是否应继续进行验证过程,或者是否应立即将其视为无效而丢弃。如果一条消息被丢弃,我需要 100% 确定它是无效的,但如果我保留无效的消息也没关系。我相信一个理想的解决方案意味着保留 1/62 的无效请求(攻击者必须猜测校验字符),但作为一个最小的解决方案,丢弃所有无效请求的一半就足够了。
我已经研究过使用 Luhn 算法(与用于信用卡的算法相同),但我希望能够使用 key 来生成字符,以使攻击者更难以欺骗校验和。
作为创建签名方案的第一次尝试,我使用 31 字节 key 对 31 字节 id 进行按位异或运算,将结果字节相加,转换为十进制并将数字相加,直到小于 62,然后将其映射到集合 [a-bA-Z0-9]
中的一个字符(下面的伪代码)。问题是,虽然我很确定这不会丢弃任何有效请求,但我不确定如何确定这会多久让无效 ID 通过,或者是否可以使用最终值检索 key 。
Set alphabet to (byte[]) "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
Set keystring to "aLaklj14sdLK87kxcvalskj7asfrq01";
Create empty byte[] key;
FOR each letter in keystring
Push (index of letter in alphabet) to key;
Create empty byte[] step1;
FOR each (r, k) in (request, key)
Push r XOR s to step1;
Set step2 to 0;
FOR each b in step1
Add (int) b to step2;
WHILE step2 > 62
Copy step2 to step3;
Set step2 to 0;
Convert step3 to String;
Split step3 between characters;
FOR each digit in step3
Add (int) digit to step2;
END WHILE
RETURN alphabet[step2]
一个确定性哈希函数,给定一个私钥和一个 31 字节长的输入,在集合 {x | x ∈ ℕ, x < 62}
中产生一个输出,其中猜测输出比计算私钥更有效。 (可变长度输入的加分)
这最终将在 NodeJS/JavaScript 中实现,但并不真正依赖于语言。
免责声明:如果这个问题过于模糊和理论化,我深表歉意。如果需要,请发表评论以进行澄清。显然,我可以通过多种方式解决这个问题,但在这种情况下,我正在寻找尽可能直接的解决方案。
最佳答案
如果您想要一个带有私钥的“确定性哈希函数”,那么我相信您可以使用 sha256(或您的加密库中的任何其他哈希函数)并将 key 附加到输入:
sha256(input+key).toString('hex');
然后,取哈希值的最后几位,将其从十六进制字符串转换为整数,将整数除以62,得到余数,根据余数确定字符。
这不会为每个字符提供完美的 1/62 分布概率(十六进制字符串应该对每个值具有均匀分布,但除以 62 后的余数不应该具有均匀分布),但应该非常接近。
关于javascript - 单字符签名方案(最低安全性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46412630/
单向链表 单向链表比顺序结构的线性表最大的好处就是不用保证存放的位置,它只需要用指针去指向下一个元素就能搞定。 单链表图解 图画的比较粗糙,简单的讲解一下: 上面四个长方形,每个长方
使用TCP,我正在设计一些类似于next的程序。 客户端在许多线程中的接收正在等待一台服务器的发送消息。但是,这是有条件的。 recv正在等待特定的发送消息。 例如 客户 thread 1: recv
我正在编写正则表达式来验证电子邮件。唯一让我困惑的是: 顶级域名可以使用单个字符吗?(例如:lockevn.c) 背景:我知道顶级域名可以是 2 个字符到任意字符(.uk、.us 到 .canon、.
是否可以在单个定义中定义同一 Controller 的多个路由? 例如: 我想要一个单一的定义 /, /about, /privacy-policy 使用类似的东西 _home: pat
我正在使用 objective-c开发针对 11.4 iOS 的单 View 应用程序,以及 Xcode版本是 9.4.1。 创建后有Main.storyboard和LaunchScreen.stor
我一直在尝试在 shell 程序中实现管道结构,如果我执行简单的命令(例如“hello | rev”),它就可以工作 但是当我尝试执行“head -c 1000000/dev/urandom | wc
此表包含主机和接口(interface)列UNIQUE 组合* 编辑:这个表也有一个自动递增的唯一 ID,抱歉我应该在之前提到这个 ** | host.... | interface..... |
我想将具有固定补丁大小的“std filter”应用于单 channel 图像。 也就是说,我希望 out[i,j] 等于 img[i,j] 附近的像素值的标准值。 对于那些熟悉 Matlab 的人,
假设我想进行网络调用并使用 rx.Single,因为我希望只有一个值。 我如何应用replay().autoConnect() 这样的东西,这样当我从多个来源订阅时网络调用就不会发生多次?我应该使用
我将图像从 rgb 转换为 YUV。现在我想单独找到亮度 channel 的平均值。你能告诉我如何实现这一目标吗?此外,有没有办法确定图像由多少个 channel 组成? 最佳答案 你可以这样做: #
在比较Go和Scala的语句结束检测时,我发现Scala的规则更丰富,即: A line ending is treated as a semicolon unless one of the foll
在IEEE 1800-2005或更高版本中,&和&&二进制运算符有什么区别?它们相等吗? 我注意到,当a和b的类型为bit时,这些coverpoint定义的行为相同: cp: coverpoint a
我正在使用Flutter的provider软件包。我要实现的是为一个 View 或页面提供一个简单的提供程序。因此,我在小部件中尝试了以下操作: Widget build(BuildContext c
我正在尝试在 cython 中使用 openmp。我需要在 cython 中做两件事: i) 在我的 cython 代码中使用 #pragma omp single{} 作用域。 ii) 使用#pra
我正在尝试从转义字符字符串中删除单引号和双引号。它对单引号 ' 或双自动 " 不起作用。 请问有人可以帮忙吗? var mysting = escapedStr.replace(/^%22/g, '
我正在尝试在 cython 中使用 openmp。我需要在 cython 中做两件事: i) 在我的 cython 代码中使用 #pragma omp single{} 作用域。 ii) 使用#pra
我正在使用 ANT+ 协议(protocol),将智能手机与 ANT+ USB 加密狗连接,该加密狗通过 SimulANT+ 连接到 PC。 SimulANT+ 正在模拟一个心率传感器,它将数据发送到
有人可以解释/理解单/多线程模式下计算结果的不同吗? 这是一个大约的例子。圆周率的计算: #include #include #include const int itera(100000000
我编写了一个粗略的阴影映射实现,它使用 6 个不同的 View 矩阵渲染场景 6 次以创建立方体贴图。 作为优化,我正在尝试使用几何着色器升级到单 channel 方法,但很难从我的着色器获得任何输出
尝试使用 Single-Spa 构建一些东西并面临添加到应用程序 AngularJS 的问题。 Angular2 和 ReactJs 工作完美,但如果添加 AngularJS 并尝试为此应用程序使用
我是一名优秀的程序员,十分优秀!