数据库表 USR02
是 SAP 系统中的一个重要表,它用于存储用户的验证信息。在 ABAP 开发中,我们经常需要与此表进行交互,以管理和验证用户的凭据。
这张表里一些主要的字段含义罗列如下:
- BNAME: 登录用户名
- GLTGV: 用户在系统生效的起始时间
- GLTGB: 用户在系统生效的截止时间
- USTYP: 用户类型。A 代表 Dialog 用户,B 代表系统用户,C 代表 Communication Data 用户,L 代表 Reference 用户,S 代表 Service 用户。
- ANAME: 创建这个用户的用户名,本例是 RFC_UVERWALT.
OCOD1: Password Hash Key
在计算机安全领域,我们通常不会直接存储用户的密码,而是存储密码的哈希值。这是因为,如果数据库被黑客攻破,直接存储的密码就可能会被窃取。但是,如果存储的是密码的哈希值,黑客即使窃取到了这些哈希值,也不能直接知道原始的密码是什么,因为哈希函数是单向的,不能从哈希值反推出原始数据。
"Password Hash Key",可以理解为用于生成密码哈希值的 "Key",它是哈希函数的一个输入。哈希函数会接受两个输入:一个是要哈希的数据(在这个场景下就是密码),另一个就是 "Hash Key"。这个 "Key" 是一个秘密的,只有系统知道,用户和其他人都不知道。系统在接收到用户的密码后,会将密码和 "Hash Key" 一起输入到哈希函数中,生成哈希值,然后将这个哈希值存储在数据库中。
那么,为什么要使用 "Hash Key" 呢?这是因为,如果我们直接使用密码作为哈希函数的输入,黑客可以通过 "彩虹表" 攻击来破解密码。"彩虹表" 是一种预先计算好的,包含了许多可能的密码和对应哈希值的表。黑客可以通过比较他窃取到的哈希值和 "彩虹表" 中的哈希值,来找出对应的密码。但是,如果我们使用了 "Hash Key",那么黑客即使有了 "彩虹表",也无法找到正确的密码,因为他不知道 "Hash Key"。
现在,我们来举一个简单的例子。假设我们有一个用户,他的密码是 "123456",我们的 "Hash Key" 是 "abc"。我们使用的哈希函数是 SHA256。首先,我们会将密码和 "Hash Key" 连接起来,得到 "123456abc"。然后,我们将 "123456abc" 输入到 SHA256 哈希函数中,得到一个哈希值,例如 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"。然后,我们将这个哈希值存储在数据库中。
当用户下次登录时,他会输入他的密码 "123456"。系统会将这个密码和 "Hash Key" 连接起来,得到 "123456abc",然后将其输入到 SHA256 哈希函数中,得到一个哈希值。系统会将这个哈希值和数据库中存储的哈希值进行比较,如果两者相同,那么说明用户输入的密码是正确的。