【问题标题】:PSQL convert/hash all values in a columnPSQL 转换/散列一列中的所有值
【发布时间】:2021-02-13 02:41:28
【问题描述】:

PHP Web 服务器的数据库初始化如下: 我想使用 pgcrypto 模块中的 PostgresSQL 的 crypt() 函数加密帐户表中的所有密码。本质上,如果这是一种常规编程语言,那么这段代码:

for password in passwd:
    set password = crypt(password, my encryption method)

我将如何在 SQL 上完成此操作?有办法吗?如有必要,我也愿意接受 PHP 解决方案。

This answer 似乎没有办法在密码中引用变量以供进一步使用;更不用说它依赖于不同的列。 This one 要求您知道每个密码的值,实际上是手动完成。

【问题讨论】:

  • 如果您要在 PHP 应用程序中使用密码,我建议您考虑使用 password_hash()password_verify()
  • 在查询中加密一切都很好,但是你必须使用 SSL 进行连接,否则 mitm 只能读取纯文本。这增加了一层设置和维护的复杂性postgresql.org/docs/9.1/ssl-tcp.html 更容易在代码中执行并通过网络发送散列
  • 是的,我会做一个 SSL,password_hash() 等看起来也很有用,谢谢。我关于将上面显示的 for 循环转换为 SQL 代码的原始问题仍然存在......或者我可能不得不在 PHP 中完成
  • 只需使用UPDATE account SET passwd = crypt(passwd, my encryption method),您不需要任何类型的循环.. rtm: postgresql.org/docs/9.1/sql-update.html
  • 在做之前注意 varchar(50),你不希望这些值被截断

标签: php sql postgresql psql


【解决方案1】:

这个伪代码的等价物:

for password in passwd:
    set password = crypt(password, my encryption method)

update 声明:

update t
    set password = crypt(password, . . .);

SQL 是一种基于集合的语言。 SQL 查询没有循环机制,因为该语言在整个表(或其过滤的子集)上运行。

如果您想过滤行以便不是全部更新,您可以添加 where 子句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多