使用GUID的部分作为ID

5
我是一名ASP .Net MVC应用程序开发者。我的一个操作需要id作为参数。例如:
public actionresult Detail(Guid id){
    return View();
}

正如你所看到的,我使用Guid而不是Int。这个问题更多是外观上的。URL可能非常长,例如localhost/Detail/0c157b42-379d-41d5-b9ba-83e9df9985b2

只取Guid的一部分像localhost/Detail/0c157b42安全吗?

6个回答

5

GUID被设计成独一无二的,但它的任何部分都不是。有关详细信息,请参见此博客文章。如果需要缩短GUID,请对其进行良好的哈希处理,例如SHA-1或(如果您没有安全问题)MD5。


缩短?你的意思是,将一个36个字符长的GUID(如果问题中的示例有效)并__缩短__为32个字符吗?(__如果__你使用md5,它将产生32个字符,而不是SHA1,它将产生48个字符) - pihentagy
1
@pihentagy:关键是在哈希之后,您可以取哈希的一部分,它将足够随机,但您不能取GUID本身的一部分。 - sharptooth

3

不,这不安全。

不过你可以计算它的SHA-2哈希值,并取前几个字符。


它可能比GUID的子字符串更独一无二,也可能比随机数更独一无二。 - Spongeboy

2
不,你需要整个GUID,因为子集可能不唯一。
例如:
0c157b42-379d-41d5-b9ba-83e9df9985b2 0c157b42-379d-41d5-b9ba-83e9df9985b3
注意,只有最后一个数字不同。开头都是相同的。你也不能使用GUID的结尾,因为无法预测创建时GUID的哪个部分会改变。

0

您可以清除-s的GUID并将HEX转换为Base32(A-Z,0-5),这将将其缩短为16个字符。


Guids是128位整数。Base32是每个字符32个值,即2^5,5位。您需要128/5=25.6个字符才能完全表示一个guid。使用Base64会更短,只需128/6=21.3个字符。小数部分由填充标识,因此您需要将这些数字向上调整几个级别以进行补偿。 - Travis Watson

0
一些其他需要考虑的选项 - * 如果有多个GUID以0c157b42开头的详细信息,则将URL localhost/Detail/0c157b42显示适用的详细信息对象列表。 * URL别名 - 在详细信息对象上允许“友好URL”字段。

-2

有点晚的回应,但以防万一有人阅读此文...

根据用途,您可以提供缩短的 GUID 值。

例如,如果 ID 值是生成并作为身份验证令牌类似值提供给用户的,则在生成过程中,您可以只取几个字符并将其与其他正在使用的值进行比较。如果有任何匹配项,则只需生成一个新值并重新比较,直到它唯一为止。

如果要修剪 GUID 的哈希值,也建议使用此技术。事实上,任何时候随机生成要用作 ID 的值时,都应确保它未被“已使用”。


我建议不要自己执行“检查是否已经在使用”操作,因为存在竞争条件的风险。这意味着您需要锁定数据库,以防止另一个线程在同一时间生成相同的ID。更好的方法是创建完整的GUID,或将ID创建推迟到数据库的责任上(例如自动递增Int)。 - Spongeboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接